使用许多UIElements提高WPF的性能

时间:2016-10-31 15:20:43

标签: c# wpf performance xaml

我是WPF的新手,我需要一些关于如何同时创建包含许多UIElements的视图的建议。我想要做的是查看某种具有固定宽度和高度的表格。在每个单元格中可以是随机数量的文本块,具有不同的背景和前景色(参见图像)。

Image for table-like view with many UiElements

这就是我到目前为止所做的...我为一个单元格的内容创建了一个usercontrol,它绑定了一个itemcontrol中的项目。

<ItemsControl ItemsSource="{Binding}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Columns="1" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Border Background="{Binding Backcolor, Converter={StaticResource IntegerToBrushConverter}}" >
                <Viewbox MaxHeight="20" >
                    <TextBlock TextWrapping="Wrap" Text="{Binding Caption}"
                        Foreground="{Binding Forecolor, Converter={StaticResource IntegerToBrushConverter}}"/>
                </Viewbox>
            </Border>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

此usercontrol也绑定到itemcontrol以表示我的表的x轴。

<ItemsControl ItemsSource="{Binding}" >
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Vertical" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <local:DayView DataContext="{Binding Days}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

对于y轴也是如此,周围有一个漂亮的滚动查看器。所以,问题是,虚拟树中有许多元素。在我的示例中,树中列出了超过60.000个元素。打开视图时,这会导致性能下降。滚动性能非常好,但他需要几秒钟才能打开视图。

我尝试过像CacheMode这样的东西,但所有这些都不会影响开放性能。使用VirtualizingStackPanel会导致滚动性能下降。我甚至无法弄清楚建立Ui需要这么长时间。似乎他需要大量时间来衡量所有UiElemtents,但我不确定......

是否有提示更快地制作这种UiElement丰富视图的提示?正如我所说,我是WPF的新手,这只是一次性能测试。我们在Winforms中有这样一个Ui,但在那里,整个表都是用户绘制的。在WPF中,使用库存内容控件重建Winforms设计非常容易,我只想为自己绘制所有内容作为最后的手段。

1 个答案:

答案 0 :(得分:0)

通过使用虚拟化来了解您的问题的可能解决方案:

WPF Data Virtualization

此外,如果您想采用另一种方式,还有商业第三方WPF控制库,可以处理虚拟化并取得不同程度的成功。仅举几例:Xceed,Syncfusion,DevExpress和Telerik。

  

我甚至无法弄清楚建立Ui需要多长时间。

希望你使用的是VS2015(或更好的东西),有几种方法可以回答这么长时间的问题。 Visual Studio有一个实时可视树工具(Debug-&gt; Windows),您可以在其中实时查看可视树,它可以帮助您找到并消除一些您不需要的UI元素(如更多边框内的边框)等等)

其次,您可以运行诊断工具(Alt + F2),选择CPU使用率,然后生成一个报告,您可以在其中查看程序花​​费最多的时间。希望这会将问题与可以在之后优化的某些方法隔离开来。

此外,欢迎提供有关您问题的更多详细信息。填充ItemsSource的代码到底是做什么的?