Добавить элемент управления WPF во время выполнения - PullRequest
28 голосов
/ 22 ноября 2008

Я написал WPF UserControl и хочу добавить один или несколько из них в окно во время выполнения, когда я нажимаю кнопку. Как я могу это сделать?

Редактировать: Дальнейшая спецификация Я хочу добавить пользовательские элементы управления в Canvas и поместить их в абсолютную позицию. Холст представляет собой рисунок этажей в моем доме, и каждый пользовательский элемент управления имеет свойства, чтобы указать, где в доме он расположен. Поэтому я хочу, чтобы все элементы управления были расположены в правильном положении на холсте.

Я думаю, что-то вроде этого

var light = new LightUserControl(2);
HouseCanvas.Children.Add(light); // this should be positioned in a specific place

Ответы [ 6 ]

39 голосов
/ 23 ноября 2008

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

var light = new LightUserControl(2);
HouseCanvas.Children.Add(light);
Canvas.SetLeft(light, 20);
Canvas.SetTop(light, 20);
12 голосов
/ 01 декабря 2008

Если вы хотите добавить элемент управления в Grid вместо Canvas, вы можете указать все свойства Grid через статический класс Grid следующим образом:

Label newLabel = new Label();
label.Content = "New Element";
Main.Children.Add(newLabel);
Grid.SetColumn(newLabel, 0);
Grid.SetRow(newLabel, 0);
2 голосов
/ 11 марта 2012

Мое решение:

for (i = 1; i <= buttoncount; i++)
{
    Button mybutton = new Button();
    Grid1.Children.Add(mybutton);
    mybutton.Height = 100;
    mybutton.Width = 100;
    mybutton.Name = "button" + i;
    mybutton.Content = mybutton.Name;
}
2 голосов
/ 22 ноября 2008

Добавьте StackPanel в окно и при каждом нажатии кнопки

 _stackPanel.Children.Add(new YourControl());  

Вы можете сделать это разными способами.

0 голосов
/ 24 апреля 2015

Просто дополняю ответ:

for (i = 1; i <= buttoncount; i++)
{
    Button mybutton = new Button();
    Grid1.Children.Add(mybutton);
    mybutton.Height = 100;
    mybutton.Width = 100;
    mybutton.Name = "button" + i;
    mybutton.Content = mybutton.Name;
    mybutton.Click += button_Click;
}

private void button_Click(object sender, RoutedEventArgs e)
{
    // do something
}
0 голосов
/ 07 сентября 2014
    public static void AddChild(this Visual parent, UIElement child)
    {
        if (InternalAddChild(parent, child))
        {
            return;
        }
        throw new NotSupportedException();
    }
    private static bool InternalAddChild(Visual parent, UIElement child)
    {
        Panel panel = parent as Panel;
        if (panel != null)
        {
            panel.Children.Add(child);
            return true;
        }
        for (int i = VisualTreeHelper.GetChildrenCount(parent) - 1; i != -1; i--)
        {
            Visual target = VisualTreeHelper.GetChild(parent, i) as Visual;
            if (target != null && InternalAddChild(target, child))
            {
                return true;
            }
        }
        return false;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...