【发布时间】:2011-10-21 00:02:49
【问题描述】:
在我的应用程序中,我有一个带有 Wpf 控件作为元素的图形(自定义 Wpf 面板)。这些元素是从 Wpf Control 派生的自定义控件。 DataTemplate 将控件与它们的视图模型相关联。 视图模型集合“GraphElements”绑定到 itemsControl,如下所示。
<ItemsControl x:Name="PART_GraphItemsControl" Grid.Column="1"
VerticalAlignment="Stretch"
HorizontalAlignment="Left"
ItemsSource="{Binding Path=GraphElements}"
VirtualizingStackPanel.IsVirtualizing="True"
VirtualizingStackPanel.VirtualizationMode="Recycling">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<local:GraphDesignerPanel HorizontalAlignment="Stretch"
VerticalAlignment="Top" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
图表中的元素可以从 2 到 500 不等。在应用程序的某些模式下,元素显示它们的值。要显示该值,该元素的 ViewModel 会触发 INotifyPropertyChanged.PropertyChanged("VariableValue")
问题: 当我在图中有 100 多个元素时,每个元素视图模型都会触发 INotifyPropertyChanged.PropertyChanged 以显示元素值。这会调用 MeasureOverride 100 多次,从而导致内存和性能问题。
如何减少 MeasureOverride 调用次数?
XAML 用于图形元素的值显示:
<TextBlock
Text="{Binding Path=VariableValue, StringFormat={}({0})}" Width="60"
FontSize="11" Name="txtBlk">
</TextBlock>
如果 VariableValue 为 null,则上面的 TextBlock 会折叠
<DataTrigger Binding="{Binding Path=VariableValue}" Value="{x:Null}">
<Setter TargetName="txtBlk" Property="Visibility" Value="Collapsed"/>
</DataTrigger>
更新:该问题可以在下面给出的链接的示例中重现。下载、构建、调试。打开 App 后,在 Window.xaml.cs MeasureOverride 中设置断点。回到应用程序并点击“点击我”按钮。断点被命中 11 次!。
http://sivainfotech.co.uk/measureoverrideissue.zip
非常感谢任何想法。
【问题讨论】:
-
也许你可以避免不必要的失效。见此链接:Build Your Tree Top-Down
标签: .net wpf performance .net-3.5 measureoverride