У меня довольно простой прокручиваемый пользовательский интерфейс календаря:
Но время от времени календарь мигает во время прокрутки. Я просмотрел WPF Performance Suite и заметил, что существует значительное количество Dirty Rect (около 400):
Разметка календаря - это ItemControl, которая связывает дни (привязаны только видимые дни). Похоже, WPF перерисовывает изо дня в день (так почему так много грязных прямоугольников для такого простого пользовательского интерфейса). Я думал, может быть, есть способ сказать WPF не перерисовывать много маленьких прямоугольников, но перерисовать весь элемент ItemsControl сразу (аналогично тому, что Double Buffering делал во все хорошие дни WinForms).
Р. 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>