• Microsoft .NET
  • WPF и Silverlight
  • Элементы управления пользовательского интерфейса Silverlight (User Interface Controls)

Элементы управления пользовательского интерфейса Silverlight (User Interface Controls) - Динамическое создание кнопки

ОГЛАВЛЕНИЕ

Динамическое создание кнопки

Сохраните файл .xaml и откройте Page.xaml.cs

Первым делом вам надо добавить обработчик события для новой кнопки,

Another.Click += new RoutedEventHandler(Another_Click);

и добавить его реализацию, где вы создадите новую кнопку и установите ее свойства,

void Another_Click(object sender, RoutedEventArgs e)
{
  Button b = new Button();
  b.Content = "I live!";
  b.SetValue(Canvas.LeftProperty, 10.0);
  b.SetValue(
  Canvas.TopProperty,
  this.newButtonPosition);
  this.newButtonPosition += 30.0;
  b.Width = 100;
  b.Height = 20;
  b.Click +=new RoutedEventHandler(new_button_click);
  myCanvas.Children.Add(b);

Поскольку свойства Left и Top полотна на самом деле не являются свойствами кнопки Button (но являются расширенными свойствами), то вы настраиваете их при помощи метода SetValue, который получает два параметра. Первый является названием свойства, которое вы хотите настроить (Canvas.LeftProperty и Canvas.TopProperty) , что не так сложно найти поскольку Intellisense их вам предоставит, и второе значение (в нашем случае - типа double).

Поскольку я хочу иметь возможность нажимать на кнопку более одного раза, то мне не нужно иметь несколько кнопок, которые переписывают друг друга, и для этого мне нужна переменная экземпляра для слежки за наибольшим значением,
private double newButtonPosition = 100.0;

После того, как я установлю ее, я могу увеличивать ее тем самым следующая кнопка будет отображена под предыдущей,

b.SetValue(
  Canvas.TopProperty,
  this.newButtonPosition);
this.newButtonPosition += 30.0; 

Вот что вы получите в результате

 

Рис. 1-14. Динамическое добавление кнопок

Относительно кнопки, которую мы добавляем, вам также необходимо обратить внимание на то, что мы добавляем регистрацию обработчика события,

b.Click +=new RoutedEventHandler(new_button_click);

Это означает, что для каждой добавленой кнопки (каждой из трех на изображении 1-8) регистрируется вызов new_button_click при ее нажатии. Вам понадобится записать данный обработчик события в ваш файл Page.xaml.cs,

void new_button_click(object sender, RoutedEventArgs e)
{
  Button btn = sender as Button;
  btn.Content = "Don't do that!";
  btn.IsEnabled = false;

Поскольку мы нажимаем на кнопки, то они изменяют текст, отображенный в них, и становятся недоступными,

Рис. 1-15. Отключаем динамические кнопки

Наконец-то! Ничего такого не произойдет, если вы не станете добавлять кнопки на страницу. В данном случае, вам нет необходимости добавлять их к LayoutRoot, так как их позиционирование осуществляется в пределах определенного холста (Canvas), и вы их можете добавить к нему

myCanvas.Children.Add(b);

При запуске программы они будут членами данного холста точно также, как если бы вы их добавили по отдельности в файл Xaml.

Скачать исходники примеров 

Источник