非常にシンプルなスクロール可能なカレンダー UI があります。
しかし、スクロール中に時々カレンダーが点滅します。WPF Performance Suite を調べたところ、かなりの量の Dirty Rects (約 400) があることに気付きました。
カレンダーのマークアップは、Days をバインドする ItemsControl です (表示される日のみがバインドされます)。WPF は毎日再描画されるように見えます (そのため、このような単純な UI に対して非常に多くの汚れた四角形が存在します)。私は、多くの小さな四角形を再描画するのではなく、ItemsControl 全体を一度に再描画するように WPF に指示する方法があるのではないかと考えました (WinForms の良い時代にダブル バッファリングが行ったことと同様です)。
PS WritableBitmap は問題を解決しますが、もっと良い方法があることを願っています
アップデート。「ダーティ リージョン アップデート オーバーレイを表示する」オプションをオンに切り替えた場合のカレンダーの外観は次のとおりです。
したがって、WPF はダーティ リージョンを正しく検出します。問題は、再描画するために非常に多くのダーティ rect を使用することにした理由です。私の推測では、スクロール中に同じである日の間のスペース (1 つまたは 2 つの白のピクセル) が原因で発生するということです。
更新 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>