пятница, 1 июня 2012 г.

WPF - Добавление элементов через код

Итак, предположим у нас имеется вот такая вот начальная разметка XAML:
<Window x:Class="WPFApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Name="mainWindow"
        Title="WPFApp" Height="550" Width="1045">
    <Grid Name="rootWindow" />
</Window>

Наша цель добавить элемент, ну например Button, в дискриптор Grid'а. То есть, чтобы во время выполнения программы, разметка приняла вот такой вид:
<Window x:Class="WPFApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Name="mainWindow"
        Title="WPFApp" Height="550" Width="1045">
    <Grid Name="rootWindow">
        <Button Content="Press me" Width="75" Height="50" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="100,50,0,0" />
    </Grid>
</Window>
Отправляемся в наш главный .xaml файл, в данном случае MainWindow.xaml.cs. После вызова InitializeComponent(), с помощью метода или же напрямую, пишем следующий код:
private void DrawButton()
{
    Button btn = new Button();
    btn.Content = "Press me";
    btn.Width = 75;
    btn.Height = 50;
    btn.Margin = new Thickness(100, 50, 0, 0); // расположение элемента в контейнере задается с помощью свойства Margin и объекта Thickness
    btn.HorizontalAlignment = HorizontalAlignment.Left;
    btn.VerticalAlignment = VerticalAlignment.Top;
    
    // Настраиваем события при необходимости
    btn.Click += (s, e) => MessageBox.Show("Clicked!");
    
    // Именем нашего Grid'а, установленного непосредственно в XAML, является rootWindow. Для добавление в него элемента мы вызываем
    // свойство Children и затем метод Add, который принимает в качестве параметра объект типа UIElement
    rootWindow.Children.Add(btn);
}

Вот и все.

PS А что если нам надо добавить элемент не к контейнеру Grid, а например непосредственно в Window через код? У объекта Window нет свойства Children но есть метод AddChild. Так может вот так?

mainWindow.AddChild(btn);

Это не сработает. Во время выполнения приложение упадет. К сожалению, на момент написание этой заметки, ответ обнаружен не был.

Комментариев нет:

Отправить комментарий