WPF:如何在具有不同名称的for循环中创建UserControl的多个实例
本文关键字:循环 for 创建 UserControl 实例 WPF | 更新日期: 2023-09-27 18:20:47
我正在创建一个WPF窗口,在其中创建UserControl的多个实例。我正在使用for循环来创建UserControl的新实例,如何为UserControl实例赋予不同的名称?这就是我正在做的:
for(i=0; i<5; i++)
{
MyUserControl <name> = new MyUserControl ();
/*code to change the properties of usercontrol*/
SomeStackPanel.Children.Add(<name>);
}
只需像这样使用Name属性:
StackPanel sp = new StackPanel();
for (int i = 0; i < 5; i++)
{
UserControl uc = new UserControl();
uc.Name = "name"+i; // add your name here
sp.Children.Add(uc);
}
编辑
在评论中回答您的问题如何获得Control
var list = sp.Children.Cast<UserControl>(); // now we are able to use Linq
var sublist = list.Where(item => item.Name == "name1"); // searching for all UserControl with the Name "name1"
var uControl = sublist.FirstOrDefault(); // will result inyour UserControl or null
//same as above just in one line
var uControl2 = sp.Children.Cast<UserControl>().Where(item => item.Name == "name2").FirstOrDefault();
如果您想以MVVM的方式创建应用程序,请不要在代码中使用名称和创建用户控件。
改为创建视图模型类的实例,将它们添加到集合中,并将集合绑定到ItemsControl
(或类似控件)ItemsSource
属性。更改项模板以呈现控件。
<ItemsControl ItemsSource="{Binding ViewModels}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"></StackPanel>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<your:MyUserControl DataContext="{Binding}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
您需要使用控件的FrameworkElement.RegisterName
来通知WPF添加了新的命名元素。
//If you are creating stack panel in code you need to uncomment next line
//NameScope.SetNameScope(SomeStackPanel, new NameScope());
for(i=0; i<5; i++)
{
MyUserControl control = new MyUserControl ();
control.Name = "name" + i;
SomeStackPanel.RegisterName(control.Name, control);
SomeStackPanel.Children.Add(control);
}
你可以在这里阅读更多关于RegisterName
的信息。