我有一個非常簡單的滾動日曆界面:在滾動過程中髒Rects分組
但不時日曆閃爍。我已經看過了WPF性能套件,發現有骯髒的Rects的顯著量(約400):
日曆標記是ItemsControl的結合天(唯一可見的天綁定)。看起來像WPF一天天重繪(所以這就是爲什麼這麼簡單的用戶界面有這麼多髒東西)。我認爲可能有一種方法可以告訴WPF不要重繪許多小矩形,但是一次重繪整個ItemsControl(類似於Double Buffering在WinForms的所有好時代中所做的)。
P. S. WritableBitmap解決了這個問題,但我希望有一個更好的方式
更新。這裏是日曆的樣子,如果我切換「顯示髒區更新覆蓋」選項上:
所以WPF正確認定髒區。問題是爲什麼它決定使用這麼多髒東西來重繪它。我的猜測是,它發生的原因是在滾動期間相同的天數之間(白色的一個或兩個像素)。
更新2
這裏是日曆的標記:
<ItemsControl Panel.ZIndex="1" Grid.Column="1"
ItemsSource="{Binding Days}"
VerticalAlignment="Center"
HorizontalAlignment="Stretch">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border Margin="1,0,1,0" Padding="0,0,3,0"
CornerRadius="1" Width="28" Height="28"
VerticalAlignment="Top">
<Border.Background>
<MultiBinding Converter="{StaticResource DayOfWeekToColorConverter}">
<Binding Path="IsWeekend"/>
</MultiBinding>
</Border.Background>
<StackPanel>
<TextBlock Style="{StaticResource TextStyle}"
HorizontalAlignment="Center"
VerticalAlignment="Center"/>
<Label Style="{StaticResource LabelStyle}"
Content="{Binding Date.Day}"
HorizontalAlignment="Center"
VerticalAlignment="Center"/>
</StackPanel>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
你試過使用ScrollViewer.CanContentScroll = true,所以你只滾動整天嗎?無論如何,半天滾動可能沒有意義。 –
@SoMoS,ScrollViewer在這裏根本沒有使用 – SiberianGuy
嘗試使用「顯示髒區域更新覆蓋圖」和「繪製帶有紫色色彩的軟件渲染」,它會顯示你的應用程序的重繪部分。張貼您的代碼可能有助於診斷問題 – makc