XamSpreadsheet1_PreviewMouseLeftButtonDown は、XamSpreadsheet 上でマウスの左ボタンが押されたときに動作するイベントハンドラです。本記事では、このイベントよりクリックされたセル範囲内の要素を特定し、クリックの結果を TextBlock に表示する処理を行います。
SpreadsheetHitTestResult の動作
SpreadsheetHitTestResult は、XamSpreadsheet 上でマウスクリックされた位置に基づいて、どの UI 要素がクリックされたかを特定するためのクラスです。この結果を利用することで、セル、ヘッダーのどの部分がクリックされたのかを判別できます。
以下のコードでは、XamSpreadsheet1_PreviewMouseLeftButtonDown イベントが発生した際に、クリック位置を取得し、HitTest メソッドを使用してヒットした要素を取得する処理を実装しています。
private void XamSpreadsheet1_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { // XamSpreadsheet がクリックされた場合に処理を行う if (sender is XamSpreadsheet spreadsheet) { // クリック位置を取得 Point clickedPoint = e.GetPosition(spreadsheet); // HitTest 実行 SpreadsheetHitTestResult hitElement = spreadsheet.HitTest(clickedPoint); if (hitElement != null) { // HitTest の結果を処理します ProcessHitTestResult(hitElement); } } }
HitTest 結果の処理
ProcessHitTestResult メソッドでは、HitTest の結果を解析し、クリックされた要素の種類に応じた処理を実行します。
private void ProcessHitTestResult(object hitElement) { if (hitElement is SpreadsheetHeaderHitTestResult headerHitTestResult) { // ヘッダーが行ヘッダーか列ヘッダーかを判定 if (headerHitTestResult.ScrollRegion is SpreadsheetRowScrollRegion) { mouseDownTextBlock.Text = $"行ヘッダーにヒットしました。行番号: {headerHitTestResult.Index + 1}"; } else if (headerHitTestResult.ScrollRegion is SpreadsheetColumnScrollRegion) { // 列インデックスをExcel形式の列名に変換 string columnName = ConvertColumnIndexToName(headerHitTestResult.Index); mouseDownTextBlock.Text = $"列ヘッダーにヒットしました。列名: {columnName}"; } else { mouseDownTextBlock.Text = "ヒットしたのはその他のヘッダータイプです。"; } } else if (hitElement is SpreadsheetCellHitTestResult cellHitTestResult) { mouseDownTextBlock.Text = $"セルにヒットしました。セル名: {cellHitTestResult.Cell}"; } else { mouseDownTextBlock.Text = "ヒットしたのはその他の要素です。"; } }
XAML 側のボタンには、PreviewMouseLeftButtonDown イベントで上記のメソッドがバインドされています。
<ig:XamSpreadsheet .... PreviewMouseLeftButtonDown="XamSpreadsheet1_PreviewMouseLeftButtonDown" > </ig:XamSpreadsheet>
実行結果
これらの実装により、XamSpreadsheet のセル範囲内をクリックした際に、そのクリックした要素を取得することができます。