【发布时间】: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