1

我正在创建一个 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>);
    }
4

3 回答 3

7

只需像这样使用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);
        }

编辑

在评论中回答您的问题如何获得控制权

        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();
于 2013-07-03T11:42:26.257 回答
3

如果您想以 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>
于 2013-07-03T11:39:35.797 回答
2

您需要使用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 您可以在此处阅读更多信息。

于 2013-07-03T14:46:02.477 回答