tutorial - Agregue control WPF en tiempo de ejecución
wpf vs windows forms (6)
Mi solución:
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;
}
Escribí un UserControl de WPF y deseo agregar uno o más elementos a mi ventana en tiempo de ejecución cuando hago clic en un botón. ¿Cómo puedo hacer eso?
Editar: más especificaciones Quiero agregar los controles de usuario a un lienzo, y colocarlos en una posición absoluta. El lienzo es un dibujo de los pisos de mi casa, y cada control de usuario tiene propiedades para indicar en qué parte de la casa está ubicado. Así que quiero que todos los controles se coloquen en la posición correcta en el lienzo.
Estoy pensando algo como esto
var light = new LightUserControl(2);
HouseCanvas.Children.Add(light); // this should be positioned in a specific place
Agregue un StackPanel a la ventana y en cada botón haga clic en
_stackPanel.Children.Add(new YourControl());
Puedes hacer esto de muchas maneras.
Después de agregar su control al lienzo, debe especificar las coordenadas superior e izquierda utilizando las propiedades adjuntas Canvas.Top y Canvas.Left de la siguiente manera.
var light = new LightUserControl(2);
HouseCanvas.Children.Add(light);
Canvas.SetLeft(light, 20);
Canvas.SetTop(light, 20);
En caso de que desee agregar el control a una cuadrícula en lugar de un lienzo, puede especificar todas las propiedades de cuadrícula a través de la clase estática de cuadrícula de la siguiente manera:
Label newLabel = new Label();
label.Content = "New Element";
Main.Children.Add(newLabel);
Grid.SetColumn(newLabel, 0);
Grid.SetRow(newLabel, 0);
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;
}
Solo complementando la respuesta:
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
}