6

2 つのWPF DataGridコントロールの水平スクロール位置を同期しようとしています。

最初の DataGrid のScrollChangedイベントをサブスクライブしています。

<toolkit:DataGrid x:Name="SourceGrid" ScrollViewer.ScrollChanged="SourceGrid_ScrollChanged">

2 番目の DataGrid があります。

<toolkit:DataGrid x:Name="TargetGrid">

イベント ハンドラで を使用しようとしましたIScrollInfo.SetHorizontalOffsetが、悲しいかな、DataGrid は公開しませんIScrollInfo

private void SourceGrid_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
    ((IScrollInfo)TargetGrid).SetHorizontalOffset(e.HorizontalOffset);
    // cast to IScrollInfo fails
}

これを達成する別の方法はありますか?IScrollInfoそれとも、スクロール位置の同期を達成するために必要なものを公開する TargetGrid に別の要素がありますか?

ところで、私は凍結された列を使用しているため、両方の DataGrid コントロールを ScrollViewers でラップすることはできません。

4

5 に答える 5

3

これを行うための素晴らしいコードがあります:

http://www.codeproject.com/KB/WPF/ScrollSynchronization.aspx

于 2011-01-03T17:38:24.790 に答える
3

Microsoft 製品グループによると、Codeplexに関する回答で説明されているように、ビジュアル ツリーを走査して ScrollViewer を見つけることが推奨される方法です。

于 2008-11-18T22:54:40.717 に答える
1

Infragistics グリッドを使用すると、凍結された列がサポートされていなかった(まだサポートされていない) ため、同じ問題が発生しました。そのため、2 つのグリッドを並べて、1 つに見えるようにしました。左側のグリッドは水平方向にスクロールしませんでしたが、右側のグリッドはスクロールしました。貧乏人の凍った柱。

とにかく、ビジュアルツリーに手を伸ばしてScrollViewer自分自身を引き出すだけになりました。結局、そこにあることはわかっていましたが、オブジェクト モデルによって公開されていなかっただけです。WPF グリッドが ScrollViewer を公開しない場合は、同様のアプローチを使用できます。または、グリッドをサブクラス化し、これを機能させるために必要な機能を追加することもできます。

なぜこれを行う必要があるのか​​ を聞くことに興味があります。

于 2008-11-16T10:31:29.267 に答える