ho un piuttosto semplice interfaccia utente calendario scorrevole:sporchi Rect raggruppamento
Ma di volta in volta lampeggia di calendario durante lo scorrimento. Ho guardato WPF Performance Suite e notato che c'è una notevole quantità di sporchi Rect (circa 400):
La marcatura del calendario è ItemsControl che lega giorni (solo giorni visibili sono vincolati). Sembra che WPF si ridisegna giorno dopo giorno (ecco perché ci sono così tanti recessi sporchi per un'interfaccia utente così semplice). Ho pensato che ci fosse un modo per dire a WPF di non ridisegnare molti piccoli rettangoli ma ridisegnare l'intero ItemsControl in una volta (simile a quello che ha fatto Double Buffering nei bei giorni di WinForms).
P. S. WritableBitmap risolve il problema, ma spero che ci sia un modo migliore
Update. Ecco come Calendar appare se posso passare l'opzione "Mostra dirty-regione aggiornamento overlay" a:
Così WPF trova correttamente la regione sporca. La domanda è: perché decide di usare così tante recinzioni per ridisegnarlo. La mia ipotesi è che ciò avvenga a causa dello spazio tra i giorni (uno o due pixel di bianco), che è lo stesso durante lo scorrimento.
Update 2.
Ecco il markup del Calendario:
<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>
Hai provato a utilizzare ScrollViewer.CanContentScroll = true in modo da scorrere solo interi giorni? Probabilmente non ha senso scorrere mezza giornata comunque. –
@SoMoS, ScrollViewer non è utilizzato qui per tutto – SiberianGuy
prova utilizzando "Mostra overlay aggiornamento area sporca" e "Disegna rendering software con tinta viola" ti mostrerà la parte ridisegnata della tua app. pubblicare il tuo codice potrebbe probabilmente aiutare a diagnosticare il problema. – makc