15

非常にシンプルなスクロール可能なカレンダー 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>
4

3 に答える 3

1

コメント リストに追加したかったのですが、そうするだけの評判がありません。点滅が見られるもう 1 つの理由として、GC による UI パフォーマンスの低下が考えられます。コードがどのように機能しているか (その一部のみが投稿されています) によっては、多くのオブジェクトを作成して孤立させている可能性があり、最終的に GC が起動し、UI がわずかに遅くなる可能性があります。perfmonを実行し、UI が点滅するたびに GC が起動されるかどうかを確認することで、これが当てはまるかどうかを確認できるはずです。

これは考慮されていないようで、アプリケーションの実行中に GC 呼び出しのトレースを実行してテストできるものであるため、この可能性についても言及する必要があると考えました。

于 2014-02-02T22:35:34.957 に答える
1

ここでの再描画の原因は、 Daysコレクションのコードから発生した不要なプロパティ変更通知が原因である可能性があります。これにより、リスト全体が再バインドされ、点滅が発生する可能性があります。

Visual Studio プロファイラーを使用して原因を絞り込み、解決してみてください。Profiler は、VS studio のプレミアム バージョンとアルティメット バージョンで利用できます。

于 2014-07-09T05:25:42.810 に答える