Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.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# 基于性能和内存多次添加相同用户控件的最佳方法?_C#_Silverlight_Xaml - Fatal编程技术网

C# 基于性能和内存多次添加相同用户控件的最佳方法?

C# 基于性能和内存多次添加相同用户控件的最佳方法?,c#,silverlight,xaml,C#,Silverlight,Xaml,我有一个类项:UserControl,我需要将这些项多次添加到面板(如网格中) 注意:我会经常清除并添加这些项目 在性能和内存消耗方面,我可以选择哪种方法 或者,(i)。只需添加如下所示的项目(UserControl) for (int i = 0; i < myCollection.Count; i++) { Item _item = new Item(); _item.Name = "Item - "+i.ToString(); panel1.Childr

我有一个
类项:UserControl
,我需要将这些项多次添加到面板(如网格中)

注意:我会经常清除并添加这些项目

在性能和内存消耗方面,我可以选择哪种方法

或者,(i)。只需添加如下所示的项目(UserControl)

 for (int i = 0; i < myCollection.Count; i++)
  {
    Item _item = new Item();
    _item.Name = "Item - "+i.ToString();
    panel1.Children.Add(_item);      
  }
for(int i=0;i

我能和你一起去吗

 <Grid ItemSource="myCollection" >
     <ItemsControl >
           <ItemsControl.ItemTemplate>
                 <DataTemplate>
                      //User control's template
                 </DataTemplate>
            </ItemsControl.ItemTemplate>
      </ItemsControl>
  </Grid>

//用户控件的模板
提前谢谢。
Joy Oyies Rex K

我不认为有什么真正的区别。
我不知道性能如何(我认为XAML和你在水下做的一样),但是内存消耗是一样的,因为在这两种情况下控件都是创建的/垃圾收集的。

关于性能,你能做的最糟糕的事情就是一遍又一遍地创建
用户控件的新实例。因此,基本上你的解决方案(i)所建议的

为什么??因为
UserControl
xaml
总是针对您创建的每个实例进行解析

那么我们能做些什么呢?您可以将控件设计为
模板控件
。这样,模板xaml只解析一次,并在实例化新实例时重用

但在代码中创建新实例仍然是不明智的。Silverlight具有
项控件
,能够处理大量条目列表,并且只能为实际可见的条目实例化可视元素

因此,我强烈建议使用
ItemsControl
(仅为可见条目实例化可视元素)

控件默认模板的一些xaml:

<Style TargetType="MyItemControl">
    <Setter Property="Template" Value="{StaticResource MyItemControlDefaultTemplate}"/>
</Style>

<ControlTemplate x:Key="MyItemControlDefaultTemplate" TargetType="MyItemControl">
...
</ControlTemplate>

...

我建议使用可以应用虚拟化的模板。因此,一旦需要,就可以创建UI元素。@Sankarann我需要动态更新面板中的项目,例如,在
按钮点击
,因此我仅在
按钮点击
事件中(通过方法1)在面板中添加了这些项目(此处仅在引发
点击
事件时才创建项目)。在这个场景中,模板化的模板是否也有帮助?模板是否也会有帮助?如果是这样的话,您可以对集合本身执行所有操作..这适用于所有场景吗?我想我不理解您的问题,但是如果您让XAML处理它,它将在您删除基础项时自动更新您的用户控件集合。
public class MyItemControl : Control
{
    public MyItemControl(){DefaultStyleKey=typeof(MyItemControl);}
}
<Style TargetType="MyItemControl">
    <Setter Property="Template" Value="{StaticResource MyItemControlDefaultTemplate}"/>
</Style>

<ControlTemplate x:Key="MyItemControlDefaultTemplate" TargetType="MyItemControl">
...
</ControlTemplate>