我有一个非常简单的可滚动日历 UI:
但在滚动过程中,日历有时会闪烁。我查看了 WPF Performance Suite 并注意到有大量的脏矩形(大约 400 个):
日历的标记是 ItemsControl,它绑定了 Days(仅绑定了可见的日期)。看起来 WPF 每天都在重绘(这就是为什么这么简单的 UI 有这么多脏矩形的原因)。我认为可能有一种方法可以告诉 WPF 不要重绘许多小矩形,而是一次重绘整个 ItemsControl(类似于双缓冲在 WinForms 的所有好日子里所做的)。
PS 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>