2

主にブール値で構成されるデータのグリッドを表示する必要があるアプリケーションがあり、チェックボックスの列が適切です。約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アクセラレーションによって相殺されるべきでしたが、結局のところ、はるかに多くのものを提供してくれます)。かろうじて使えるものでも、使えるものが欲しい。

4

2 に答える 2

1

これは主に、CheckBoxビジュアルツリーが非常に複雑であるためです。ビジュアルツリーのスタイルを変更すると、パフォーマンスが大幅に向上します。

ControlTemplate(単一の境界線)には単一の要素しかありませんが、遅延や遅延はありませんでした。ここから特定のスタイルを取得できます:http: //msdn.microsoft.com/en-us/library/ms752319%28v=vs.85%29.aspx

確かに、データバインディングにはある程度の時間がかかります。これを参照してください: データバインディングの最適化、通常のプロパティへのバインディングに時間がかかることを説明しています。通常、それは反射を伴うためです。依存関係プロパティを使用する場合、リフレクションは含まれません。私の知る限りでは。

あなたのクラスは確かに大きくはありませんが、あなたは確かにテストすることができます。すべてが依存関係プロパティである場合、パフォーマンスは向上しますか?

問題が発生した場合はお知らせください。

于 2012-09-01T18:53:28.293 に答える
1

私のコメントで述べたように、私は質問がわかりません。WPFでグリッドのパフォーマンスを探している場合は、ListView/GridViewに移動します。DataGridの機能がない限り、必要です。それはより多くのコードですが、それだけの価値があります。私は40列と1000行のGridViewを持っており、パフォーマンスは良好です(そしてDataGridのパフォーマンスは悪かった)。

于 2012-09-01T19:02:26.180 に答える