3

月ごとにレイアウトされた可変範囲の日を表示するために使用される日付コントロールを作成しました。曜日は、午前、午後、または 1 日全体の 2 文字のコードを表示するように設計されており、背景を特定の色に設定することができます。次に例を示します。

カレンダーの見本

日を均等に配置し、日番号の列と一致させるために、Stackpanel に含まれる UniformGrid を使用しました。

<StackPanel DockPanel.Dock="Bottom" Orientation="Horizontal">
                <ItemsControl Name="cal" ItemsSource="{Binding Days}">
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <UniformGrid  Rows="13" Columns="32" Margin="0,0,1,5" Width="1158" />
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <local:ucYearViewDay/>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </StackPanel>

INotifyPropertyChanged日はそれぞれ、 AM、PM、または終日コードの表示をサポートするように設計したユーザー コントロールです。次に、日付コントロールがバインドされている ObservableCollection に日が追加されます。

問題

上記の設定作業はすべて、コンストラクターの呼び出しから行われます。Form.Show()が呼び出されると、フォームのレンダリングに約 10 ~ 12 秒かかります。

リサーチ

これをスピードアップするために何ができるかを読むのに少し時間を費やしましたが、役立つものを見つけることができないようです. この投稿で提案されているように、仮想化を利用するように ItemsControl を設定しようとしましたが、違いはありませんでした.多くのスクロールを使用し、コントロールがスクロールしない場合にのみ、この方法でパフォーマンスが向上することを理解しています. MSDN には、私が調べてきたWPF パフォーマンスの改善に関するガイドがあります。具体的には、データ バインディングに関するセクションですが、あまり役立つものは見つかりませんでした。

私が言ったことに基づいて、物事をスピードアップするために採用できる他のテクニックはありますか? バインディングをやめてコントロールに直接書き込むこともできると思いますが、これは最後の手段です。

4

2 に答える 2

1

VirtualizingStackPanel.IsVirtualizing="True" は、ItemPanel を VirtualizingStackPanel として設定した場合にのみ機能します。独自の Virtualized uniformGrid を作成することで、パフォーマンスを向上させることができます。仮想化されたタイル パネルの作成方法については、以下のリンクを参照してください。同様に、パフォーマンスを向上させる独自のパネルを作成できます。

http://blogs.msdn.com/dancre/archive/2006/02/06/implementing-a-virtualized-panel-in-wpf-avalon.aspx

于 2013-07-24T09:24:37.190 に答える
1

いくつかのパフォーマンス ツールを使用するという @Erno de Weerd の提案に基づいて、私は探し回り、VS2012 で使用可能なパフォーマンス ツールに関するこの投稿を読んだ後、[分析] メニューの [パフォーマンス分析] オプションを使用してトレースを実行しました。

結果は私にとって非常に驚くべきものでした。カレンダーの読み込みは「最も個人的な作業を行う関数」リストに掲載されていますが、それらは実際には目立ちませんでした. いつも取っていたのは、私が開始したコードの一部でしTask.Factory.StartNew()NamedPipeServerStream

ここに画像の説明を入力

このコードは、アプリケーションの別の部分への着信メッセージをチェックするためにインターフェースによって使用されます。アプリケーションの速度が低下していることに気づいていませんが、アプリケーションが WPF 関連のタスクでビジー状態の場合、反応が悪いようです。このコードを削除すると、カレンダー コントロールが 2 秒未満で読み込まれます。すぐに問題のあるコードを書き直します。

したがって、教訓:パフォーマンス ツールを使用します。すべてのコメント、ヘルプ、提案に感謝します。

于 2013-07-24T14:26:09.070 に答える