Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF:如何在具有不同名称的for循环中创建UserControl的多个实例?_C#_Wpf_Windows_User Controls - Fatal编程技术网

C# WPF:如何在具有不同名称的for循环中创建UserControl的多个实例?

C# WPF:如何在具有不同名称的for循环中创建UserControl的多个实例?,c#,wpf,windows,user-controls,C#,Wpf,Windows,User Controls,我正在创建一个WPF窗口,在其中我正在创建一个UserControl的多个实例。 我正在使用for循环创建UserControl的新实例,如何为UserControlinstance指定不同的名称? 这就是我正在做的: for(i=0; i<5; i++) { MyUserControl <name> = new MyUserControl (); /*code to change the properties of userco

我正在创建一个WPF窗口,在其中我正在创建一个UserControl的多个实例。 我正在使用for循环创建UserControl的新实例,如何为UserControlinstance指定不同的名称? 这就是我正在做的:

    for(i=0; i<5; i++)
    {
        MyUserControl <name> = new MyUserControl ();
        /*code to change the properties of usercontrol*/
        SomeStackPanel.Children.Add(<name>);
    }

for(i=0;i如果要以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>

如果要以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>

只需使用如下属性:

        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);
        }
StackPanel sp=new StackPanel();
对于(int i=0;i<5;i++)
{
UserControl uc=新的UserControl();
uc.Name=“Name”+i;//在此处添加您的姓名
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();
var list=sp.Children.Cast();//现在我们可以使用Linq了
var sublist=list.Where(item=>item.Name==“name1”);//搜索名为“name1”的所有UserControl
var uControl=sublist.FirstOrDefault();//将导致您的UserControl或null
//仅在一行中与上面相同
var uControl2=sp.Children.Cast();
只需使用如下属性:

        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);
        }
StackPanel sp=new StackPanel();
对于(int i=0;i<5;i++)
{
UserControl uc=新的UserControl();
uc.Name=“Name”+i;//在此处添加您的姓名
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();
var list=sp.Children.Cast();//现在我们可以使用Linq了
var sublist=list.Where(item=>item.Name==“name1”);//搜索名为“name1”的所有UserControl
var uControl=sublist.FirstOrDefault();//将导致您的UserControl或null
//仅在一行中与上面相同
var uControl2=sp.Children.Cast();

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

}
//如果要在代码中创建堆栈面板,则需要取消对下一行的注释
//SetNameScope(SomeStackPanel,newnamescope());

对于(i=0;i您需要使用
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);

}
//如果要在代码中创建堆栈面板,则需要取消对下一行的注释
//SetNameScope(SomeStackPanel,newnamescope());

对于(i=0;iHi WiiMaxx,当我尝试此操作时,我没有在另一个函数中获得Usercontrol的实例。我无法使用第二行中更新的名称访问Usercontrol。WPF的强大之处在于它不是WinForms。使用WinForms样式代码创建WPF将导致灾难。@KarelFrajtak当然,但他在问如何创建它“解决"这个问题是基于他的代码。有时你必须犯这样的错误才能从中吸取教训。嗨,WiiMaxx,当我尝试这样做时,我没有在另一个函数中得到Usercontrol的实例。我无法访问第二行中更新了名称的Usercontrol。WPF的强大之处在于它不是WinForms。使用WinForms样式的代码创建WPF将导致灾难。@KarelFrajtak肯定,但他在问如何根据他的代码“解决”问题。有时你必须犯这样的错误才能从中吸取教训。