月ごとにレイアウトされた可変範囲の日を表示するために使用される日付コントロールを作成しました。曜日は、午前、午後、または 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 パフォーマンスの改善に関するガイドがあります。具体的には、データ バインディングに関するセクションですが、あまり役立つものは見つかりませんでした。
私が言ったことに基づいて、物事をスピードアップするために採用できる他のテクニックはありますか? バインディングをやめてコントロールに直接書き込むこともできると思いますが、これは最後の手段です。