WPF控制大量数据的性能问题

时间:2013-07-24 09:10:01

标签: c# wpf performance xaml

我写了一个日期控件,用于显示按月布局的可变范围的天数。这些日期旨在显示AM,PM或整天的双字母代码,并且可以将其背景设置为特定颜色,例如:

Sample of the calendar

为了让天数均匀分布并匹配日期数列,我使用了Stackpanel中包含的UniformGrid:

<StackPanel DockPanel.Dock="Bottom" Orientation="Horizontal">
                <ItemsControl Name="cal" ItemsSource="{Binding Days}">
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <UniformGrid  Rows="13" Columns="32" Margin="0,0,1,5" Width="1158" />
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <local:ucYearViewDay/>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </StackPanel>

这些日子都是用户控件(暗示INotifyPropertyChanged)我设计的支持显示AM,PM或全天代码。然后将日期添加到日期控件绑定的ObservableCollection中。

问题

所有上述设置工作都是从构造函数中的调用完成的,当调用Form.Show()时,渲染表单大约需要10-12秒。

研究

我花了一点时间阅读我可以做些什么来加快速度,但我似乎无法找到任何帮助。我已经尝试将ItemsControl设置为使用this post中建议的虚拟化,但这没有任何区别 - 据我所知,如果我使用大量滚动并且我的控件没有这样,我只能通过这种方式获得性能提升滚动。我一直在寻找guide on MSDN about improving WPF performance,特别是关于data binding的部分,但我找不到任何有用的东西。

根据我所说的,是否还有其他技术可以加快速度?我想我可以取消绑定并直接写入控件,但这将是最后的手段。

2 个答案:

答案 0 :(得分:1)

VirtualizingStackPanel.IsVirtualizing =“True”仅在将ItemPanel设置为VirtualizingStackPanel时才有效。您可以通过编写自己的Virtualized uniformGrid来提高性能。请参阅以下链接,了解如何制作虚拟化平铺面板。以同样的方式,您可以编写自己的面板,这将提高性能。

http://blogs.msdn.com/dancre/archive/2006/02/06/implementing-a-virtualized-panel-in-wpf-avalon.aspx

答案 1 :(得分:1)

基于@Erno de Weerd关于使用一些性能工具的建议,我在阅读this post about the performance tools available in VS2012后进行了搜索,我在“分析”菜单中使用了“性能分析”选项并让跟踪运行。

结果令我非常惊讶。虽然在“功能最多的个人工作”列表中加载了日历,但它们并没有真正脱颖而出。我一直在讨论的是我通过Task.Factory.StartNew()启动的一段代码NamedPipeServerStream

enter image description here

接口使用

This code来检查到应用程序另一部分的传入消息。虽然我没有注意到它减慢了应用程序的速度,但是当应用程序忙于与WPF相关的任务时,它似乎反应很糟糕。删除此代码意味着日历控件在不到两秒的时间内加载。我将很快重写有问题的代码。

所以,经验教训:use performance tools。感谢所有评论,帮助和建议。