在我的应用程序中,我有一个带有 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
任何想法都非常感谢。