3

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

日历样本

为了使天数均匀分布并匹配天数列,我使用了 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 秒来呈现表单。

研究

我花了一些时间阅读我可以做些什么来加快速度,但我似乎无法找到任何帮助。我已经尝试设置 ItemsControl 以按照本文中的建议使用虚拟化,但这没有任何区别 - 据我所知,如果我使用大量滚动并且我的控件不滚动,我只会以这种方式获得性能提升。MSDN 上有一个关于提高 WPF 性能的指南,我一直在查看,特别是关于数据绑定的部分,但我没有找到任何帮助。

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

4

2 回答 2

1

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

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

于 2013-07-24T09:24:37.190 回答
1

根据@Erno de Weerd 关于使用一些性能工具的建议,我四处寻找,在阅读了这篇关于 VS2012 中可用的性能工具的帖子后,我使用了“分析”菜单上的“性能分析”选项并让跟踪运行。

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

在此处输入图像描述

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

所以,经验教训:使用性能工具。感谢所有的评论、帮助和建议。

于 2013-07-24T14:26:09.070 回答