主にブール値で構成されるデータのグリッドを表示する必要があるアプリケーションがあり、チェックボックスの列が適切です。約200行の約40〜60のチェックボックス列があります。WPFでそのようなことをするのは簡単だと思いました。
WPFでまともな水平スクロールエクスペリエンスに近づくことすらできません。私が話していることを確認するには、を作成してWindow
そのDataGrid
上に配置し、を設定してからAutoGenerateColumns="True"
、コンストラクターの後に次を追加しますInitializeComponent();
。
dataGrid1.ItemsSource = Create(200, i => new { b1 = true, b2 = false, b3 = true, b4 = false, b5 = true, b6 = false, b7 = true, b8 = false, b9 = true,
b10 = false, b11 = true, b12 = false, b13 = true, b14 = false, b15 = true, b16 = false, b17 = true, b18 = false, b19 = true, b20 = false, b21 = true,
b22 = false, b23 = true, b24 = false, b25 = true, b26 = false, b27 = true, b28 = false, b29 = true, b30 = false, b31 = true, b32 = false });
このメソッドが必要です。これも追加してください。
ObservableCollection<T> Create<T>(int count, Func<int, T> creator)
{
return new ObservableCollection<T>(Enumerable.Range(0, count).Select(creator));
}
アプリケーションを実行し、水平方向にスクロールしてみます。ひどいですね。垂直スクロールもそれほど熱くはありません。
WinFormsアプリケーションでも同じことを行いましたが、スクロールはすべての方向で非常にスムーズで、DataGridView
'sDoubleBuffered
プロパティをに強制した後はWPFと同じように見えましたtrue
。比較するには、新しいForm
、plop aDataGridView
を作成し、コンストラクターの後に以下を追加しますInitializeComponent();
。
typeof(DataGridView).GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(dataGridView1, true, null);
for (int i = 0; i < 64; i++)
dataGridView1.Columns.Add(new DataGridViewCheckBoxColumn {HeaderText = "C" + i, Width = 30});
for (int i = 0; i < 400; i++)
dataGridView1.Rows.Add();
これは、列数が2倍、行数が2倍で、水平方向と垂直方向の両方で、新生児の底と同じくらいスムーズにスクロールします。
しかし、残念ながら、WinFormsでは必要なことを実行できません。テンプレート化された列が必要です。構成可能性が必要です。
WPFでのスクロールの問題を解決するために、次のすべての組み合わせを試しました。
- EnableColumnVirtualization(true / false)
- EnableRowVirtualization(true / false)
- ScrollViewer.CanContentScroll(true / false)-
false
垂直スクロールのみを改善します - 固定サイズの列
- 固定サイズのデータグリッド
- VirtualizingStackPanel.VirtualizationMode(Recycling / Standard)-チェックされているコントロールをリサイクルし、チェックされていない新しい行に配置して、アニメーションをフェードアウトさせる
Recycling
バグがあります。CheckBox
これにより、チェックボックスに「ゴースティング」効果があるように見えます。 - ScrollViewer.IsDeferredScrollingEnabled-申し訳ありませんが、Windows3.1スタイルのスクロールへのダウングレードを受け入れることはできません。
私は標準以下のパフォーマンスを喜んで受け入れます。WinFormsの滑らかさのようなものは期待していません(WPFは、WPFのGPUアクセラレーションによって相殺されるべきでしたが、結局のところ、はるかに多くのものを提供してくれます)。かろうじて使えるものでも、使えるものが欲しい。