【问题标题】:WPF: How to create Multiple instances of a UserControl inside a for loop with different name?WPF:如何在具有不同名称的 for 循环中创建 UserControl 的多个实例?
【发布时间】:2013-07-04 02:29:48
【问题描述】:

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

【问题讨论】:

    标签: c# wpf windows user-controls


    【解决方案1】:

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

    【讨论】:

    • 嗨 WiiMaxx,当我尝试这个时,我没有在另一个函数中获得 Usercontrol 的实例。我无法使用我在第二行中更新的名称访问用户控件。
    • WPF 的强大之处在于它不是 WinForms。使用 WinForms 风格的代码创建 WPF 将导致灾难。
    • @KarelFrajtak 当然,但他在问如何根据他的代码“解决”问题。有时你必须犯这样的错误才能从中吸取教训。
    【解决方案2】:

    如果您想以 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>
    

    【讨论】:

      【解决方案3】:

      您需要为您的控件使用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);
      
      }
      

      你可以阅读更多关于RegisterNamehere的信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-19
        • 1970-01-01
        • 2021-06-18
        • 2014-12-28
        • 1970-01-01
        • 2013-04-03
        相关资源
        最近更新 更多