その行(DataGridRow)が、DataGridの表示領域内にあるかどうか

DataGridには、DataGridの行(DataGridRow)が表示領域(Viewport)にあるかどうか?みたいなメソッドがない。UI仮想化の設定がなければ、すべての行に実体があり、見えていようといまいと、IsVisible=trueだったりする。UI仮想化があったとしても、CurrentCellがある行には隠れていても実体があり、実際の特定は難しい。
作ってみましたとも(参)で作った、セルのマージ処理の改良時に、それが正確にわからないものかと調べていたら、いいのがあった。
Counting the number of visible rows in a DataGrid

/// <summary>
/// 指定のDataGridRowオブジェクトが表示されているか(ViewPort内にあるかどうか)を取得します。
/// </summary>
/// <param name="dataGrid">DataGridオブジェクト</param>
/// <param name="dataGridRow">チェック対象となるDataGridRowオブジェクト</param>
/// <returns>true:表示領域内にある</returns>
public static bool IsInViewPort(this DataGrid dataGrid, DataGridRow dataGridRow) {

//そもそもVisible設定がOFFになっている。
if (dataGridRow == null || !dataGridRow.IsVisible) {
return false;
}

//座標変換(おそらくDataGridからの相対的な座標に変換する)
var bounds = dataGridRow.TransformToAncestor(dataGrid).
TransformBounds(new Rect(0, 0,
dataGridRow.ActualWidth,
dataGridRow.ActualHeight));
//DataGrid自身の領域
var rect = new Rect(0, 0, dataGrid.ActualWidth, dataGrid.ActualHeight);
//DataGrid内の領域に含まれていれば、ViewPoprt内にあるとみなせる。
return rect.Contains(bounds.TopLeft) || rect.Contains(bounds.BottomRight);
}

このメソッドを使ったお陰で処理精度があがった。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m