我是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设计非常容易,我只想为自己绘制所有内容作为最后的手段。
答案 0 :(得分:0)
通过使用虚拟化来了解您的问题的可能解决方案:
此外,如果您想采用另一种方式,还有商业第三方WPF控制库,可以处理虚拟化并取得不同程度的成功。仅举几例:Xceed,Syncfusion,DevExpress和Telerik。
我甚至无法弄清楚建立Ui需要多长时间。
希望你使用的是VS2015(或更好的东西),有几种方法可以回答这么长时间的问题。 Visual Studio有一个实时可视树工具(Debug-&gt; Windows),您可以在其中实时查看可视树,它可以帮助您找到并消除一些您不需要的UI元素(如更多边框内的边框)等等)
其次,您可以运行诊断工具(Alt + F2),选择CPU使用率,然后生成一个报告,您可以在其中查看程序花费最多的时间。希望这会将问题与可以在之后优化的某些方法隔离开来。
此外,欢迎提供有关您问题的更多详细信息。填充ItemsSource的代码到底是做什么的?