【问题标题】:WPF controls performance issues with large amounts of dataWPF 控制大量数据的性能问题
【发布时间】:2013-07-24 09:10:01
【问题描述】:

我编写了一个日期控件,用于显示按月排列的可变范围的天数。这些日子旨在显示上午、下午或全天的两个字母代码,并且可以将其背景设置为特定颜色,例如:

为了使天数均匀分布并匹配天数列,我使用了 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)我设计支持显示上午、下午或全天代码。然后将日期添加到日期控件绑定到的 ObservableCollection 中。

问题

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

研究

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

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

【问题讨论】:

  • 你的网格显示了多少项目?
  • @MariusBancila 通常它会显示一年,尽管它可能不会显示从 1 月 1 日到 12 月 31 日的数据,显示范围由用户设置。
  • 您是否使用性能工具找出大部分时间都花在了哪里?
  • @ErnodeWeerd 好一点,我现在看看使用一些东西,看看我是否能更好地了解延迟在哪里,你个人有什么推荐的吗?
  • 有了这么多元素,它可能是数据的加载或 UI 元素的布局排列通道。但与其猜测你应该只是测试:)

标签: c# wpf performance xaml


【解决方案1】:

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

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

【讨论】:

  • 谢谢,但我的控件不使用任何滚动。从我在那篇文章中可以看出,虚拟化控件的性能提升来自使用滚动。
【解决方案2】:

根据@Erno de Weerd 关于使用一些性能工具的建议,我四处寻找,在阅读了this post about the performance tools available in VS2012 之后,我使用了“分析”菜单上的“性能分析”选项并运行跟踪。

结果让我很惊讶。虽然日历的加载出现在“做最多个人工作的功能”列表中,但它们并没有真正脱颖而出。一直占用的是我通过Task.Factory.StartNew() 发起的一段代码,它发起了NamedPipeServerStream

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

所以,吸取教训:use performance tools。感谢所有 cmets、帮助和建议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-03
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多