WPF性能優化集錦
一、UI渲染性能優化
1. 虛擬化技術
??ListView/GridView虛擬化??:
<ListView VirtualizingStackPanel.IsVirtualizing="True"VirtualizingStackPanel.VirtualizationMode="Recycling"ScrollViewer.IsDeferredScrollingEnabled="True"><!-- ItemTemplate... -->
</ListView>
??關鍵點??:
IsVirtualizing="True"
:啟用虛擬化(默認值)VirtualizationMode="Recycling"
:重用容器(比標準虛擬化更高效)IsDeferredScrollingEnabled="True"
:延遲滾動更新
??DataGrid虛擬化??:
<DataGrid VirtualizingStackPanel.IsVirtualizing="True"EnableRowVirtualization="True"EnableColumnVirtualization="True"ScrollViewer.IsDeferredScrollingEnabled="True"><!-- 列定義... -->
</DataGrid>
2. 減少不必要的重繪
??凍結靜態資源??:
<Window.Resources><SolidColorBrush x:Key="StaticBrush" Color="Blue" PresentationOptions:Freeze="True"/>
</Window.Resources>
??使用x:Shared="False"??:
<Window.Resources><DataTemplate x:Key="ItemTemplate" x:Shared="False"><!-- 模板內容 --></DataTemplate>
</Window.Resources>
??避免頻繁觸發InvalidateArrange/InvalidateMeasure??:
// 不好的做法
private void UpdateUI()
{// 多次修改屬性會觸發多次布局計算myControl.Width = 100;myControl.Height = 200;myControl.Margin = new Thickness(10);
}// 好的做法 - 批量更新
private void UpdateUI()
{myControl.BeginInit();myControl.Width = 100;myControl.Height = 200;myControl.Margin = new Thickness(10);myControl.EndInit();
}
二、數據綁定優化
1. 高效的數據綁定模式
??使用INotifyPropertyChanged最小化通知??:
private string _name;
public string Name
{get => _name;set {if (_name != value){_name = value;OnPropertyChanged(nameof(Name));// 只有當Name變化會影響其他屬性時才通知if (value.Length > 10) OnPropertyChanged(nameof(IsNameLong));}}
}
??使用OneTime綁定減少開銷??:
<TextBlock Text="{Binding StaticText, Mode=OneTime}"/>
2. 高級綁定技術
??使用x:Reference減少綁定路徑??:
<StackPanel><TextBox x:Name="InputBox" Text="{Binding InputText, UpdateSourceTrigger=PropertyChanged}"/><TextBlock Text="{Binding Text, ElementName=InputBox}"/>
</StackPanel>
??使用MultiBinding與優先級綁定??:
<TextBlock><TextBlock.Text><PriorityBinding><Binding Path="FastProperty" IsAsync="True"/><Binding Path="SlowProperty"/></PriorityBinding></TextBlock.Text>
</TextBlock>
三、樣式與模板優化
1. 樣式共享
??定義可重用樣式??:
<Window.Resources><Style x:Key="CommonButtonStyle" TargetType="Button"><Setter Property="Background" Value="#FFDDDDDD"/><Setter Property="Foreground" Value="#FF333333"/></Style><!-- 應用樣式 --><Button Style="{StaticResource CommonButtonStyle}" Content="按鈕1"/><Button Style="{StaticResource CommonButtonStyle}" Content=