2010-08-13 115 views
0

那么这里的问题是,如果你有一个DataTemplate类型的对象,每次存在对象时,DataTemplate将被创建,这听起来是正确的。WPF DataTemplate性能

我的问题是,我们的DataTemplate有点沉重,应用程序可能有大约1000个使用该DataTemplate的对象。

我创建了一个简单的例子,我创建了5个Person对象,并将它们绑定到一个ListView。 Person对象的DataTemplate是一个带有标签的Grid和带有2个MenuItem的ContextMenu。为了简单起见,我只想集中在MenuItems中。使用内存分析器,我可以看到总共有10个MenuItem对象(每个人2个,5人* 2 MenuItem = 10个MenuItem),我想知道是否有办法避免这种情况。假设每个Person对象都应该共享相同的MenuItem引用,以避免每次创建人员时重复DataTemplate。

这些是内存分析器的结果。

谢谢!

这是我的代码:

C#

using System.Collections.Generic; 
using System.Windows; 

namespace MenuItemsTest 
{ 
    /// <summary> 
    /// Interaction logic for Window1.xaml 
    /// </summary> 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 

      this.DataContext = new List<Person>() 
      { 
       new Person("Jim Morrison"), 
       new Person("Jimmy Page"), 
       new Person("Jimmy Hendrix"), 
       new Person("Janis Joplin"), 
       new Person("Peter Frampton") 
      }; 
     } 
    } 

    public class Person 
    { 
     public string Name { get; set; } 

     public Person(string name) 
     { 
      this.Name = name; 
     } 
    } 
} 

XAML:

<Window x:Class="MenuItemsTest.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:MenuItemsTest" 
    Title="Window1" Height="300" Width="300"> 
    <Window.Resources> 
     <DataTemplate DataType="{x:Type local:Person}"> 
      <Grid> 
       <Grid.ContextMenu> 
        <ContextMenu> 
         <MenuItem Header="Select" /> 
         <MenuItem Header="Deselect" /> 
        </ContextMenu> 
       </Grid.ContextMenu> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="*" /> 
       </Grid.ColumnDefinitions> 
       <Label Content="{Binding Name}" /> 
      </Grid> 
     </DataTemplate> 
    </Window.Resources> 
    <Grid> 
     <ListView ItemsSource="{Binding}" /> 
    </Grid> 
</Window> 

回答

0

的DataTemplates是要走的路,但你不希望如果只说20个个instansiated在屏幕上可见:

尝试虚拟化堆栈面板。如果您不需要ListBox的列表视图功能。更简单的控制=>更好的性能。

非常重要的是,不要让ListView维度无界限(即不要让scrollviewer设置它),因为即使您使用虚拟化堆栈面板,也会瞬间创建所有数据模板。

<ListView 
    ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
    ScrollViewer.VerticalScrollBarVisibility="Auto" 
    VirtualizingStackPanel.IsVirtualizing="True" 
    VirtualizingStackPanel.VirtualizationMode="Standard" 
    ItemsSource="{Binding}" 
    /> 
+0

使用虚拟化stackpanel我有一个相当复杂的数据模板(我正在玩MemoryMappedFile)约亿行。 – FuleSnabel 2010-08-13 22:01:39