2012-03-13 66 views
0

我正在使用DataTemplate动态更改我的UI视图。DataTemplate切换性能

但是,我发现性能是相当不可接受的。

这里是我的代码:

XAML(可Views.xaml):

<ResourceDictionary> 
    <DataTemplate .... x:name="D1" ....../> 
    <DataTemplate .... x:name="D2" ....../> 
    <DataTemplate .... x:name="D3" ....../> 
    <DataTemplate .... x:name="D4" ....../> 
</ResourceDictionary> 

代码:

ResoucesDictionary RD = Application.LoadComponent(new Uri("../Views.xaml", UriKind.Relative)) as ResourceDictionary; 

if (...condition..) 
{ 
    MyGroupBox.ContentTemplate = RD["D1"] as DataTemplate; 
} 
else if (....condition...) 
{ 
    MyGroupBox.ContentTemplate = RD["D2"] as DataTemplate; 
} 
..... 
..... 
.... 
. 
.... 
else 
{ 
....... 
} 

MyGroupBox是我的UI的分组框中的实例。我希望在运行时更改GroupBox的视图,以便使用DataTemplate。

但是,我发现只要特定条件被触发,就会在> 0.5秒后显示正确的用户界面。

难道DataTemplate的性能很差吗?或者有什么我错过了?或错?

非常感谢。

+0

在切换模板期间是否正在进行任何动画? – 2012-03-13 03:30:45

+0

大多数情况下,数据模板是在Xaml中而不是在代码中选择的。你确定你的代码是必需的吗?如果你能解释你的情况,它可能会有所帮助。 – 2012-03-13 14:29:59

+0

此外,您似乎每次点击该方法时都会加载和解析'Views.xaml'的内容 - 这可能会导致性能下降。也许如果你至少缓存了这个值,你会看到更好的结果。 – 2012-03-13 14:30:41

回答

1

有几件事情来思考......

  1. 问题可能是由于数据模板显示什么。您可以进行快速测试。只需将数据模板中的视图替换为更简单和基本的视图,如一堆文本块和文本框。现在是否需要同一时间?如果不是那么你的意见是花时间加载而不是数据模板。

  2. 如果你的观点很慢,那么检查你的风格是否缓慢。你是否在使用软件加速处理诸如模糊,发光等效果?如果是的话请切换到硬件加速的影响。

  3. 问题也可能是由于您的数据模板的视图可能是在加载数据模板时从后端服务 /数据库获取数据。你能否将这一数据加载到不同线程?因为如果你不这样做,那么它将在GUI上执行,从而挂起GUI。

  4. 您是否显示了一个列表项?你的物品控制(基本物品控制,列表框,列表视图,树形视图,数据网格)显示物品列表虚拟化?您是否在该列表上应用任何默认分组或排序?如果是这样,那么应用LINQ进行分组或排序(如果可能的话)。使用虚拟化物品控件。

请检查此线程为performance improvements in a WPF GUI

0

之前我会先检查我的数据绑定是否正确。

只要打开调试窗口,看看是否有任何绑定警告。如果你确定,那么问题出现在你的视图中,而不是数据模板。 AngelWPF的回答给出了许多关于如果是这种情况该怎么做的提示。

+0

绑定失败很快,通常不应该是性能问题。尽管如此,对于一般的做法仍然不是一个坏主意。 – 2012-03-13 14:36:57

+0

@Dan Puzey我认为这很大程度上取决于您的数据量。如果你尝试填充一个带有足够记录的ListView,而不是疯狂的,比如说300或者500,那么差别可能是明确的数据绑定和有错误的数据之间的秒数。 – Dummy01 2012-03-13 14:59:48

+0

我刚刚测试过这个(我很感兴趣)......在非虚拟化列表和duff绑定中有1000个简单项('DateTime's),有一个明显的命中(大约2秒) - 但我必须手动禁用虚拟化来查看它。虚拟化和屏幕上只有40个物品,没有明显的打击。从中得到你想要的! :) – 2012-03-13 15:18:48

1

我已经评论这一点,但我会在这里发布它作为一个答案,因为我认为这很可能是你的主要问题:

您正在加载每次你打的代码的时间解析的Views.xaml内容 - 这会影响性能。

如果您在呼叫之间缓存该行的输出,您会看到更好的结果。

+0

非常好的一点 – Dummy01 2012-03-13 15:04:46