Получить сетку с помощью мыши

У меня есть WPF Grid, который разделен на 3 строки и 3 столбца, я не смог найти способ получить номер строки и столбца мыши, щелкнув по сети, о, а если возможно, это будет лучше для моего что эта часть будет в коде, а не XAML, это моя простая grid:

            

Столкнувшись с той же проблемой, я придумал это решение:

XAML:

  

ПРИМЕЧАНИЕ. Grid должна быть предоставлена ​​фоном, чтобы поднять событие мыши вниз, см.: Как получить сетку, чтобы поднять события MouseDown, когда UIElemets в ячейках не нажали?

Код-за:

 private void OnPreviewMouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) { if(e.ClickCount == 2) // for double-click, remove this condition if only want single click { var point = Mouse.GetPosition(myGrid); int row = 0; int col = 0; double accumulatedHeight = 0.0; double accumulatedWidth = 0.0; // calc row mouse was over foreach (var rowDefinition in myGrid.RowDefinitions) { accumulatedHeight += rowDefinition.ActualHeight; if (accumulatedHeight >= point.Y) break; row++; } // calc col mouse was over foreach (var columnDefinition in myGrid.ColumnDefinitions) { accumulatedWidth += columnDefinition.ActualWidth; if (accumulatedWidth >= point.X) break; col++; } // row and col now correspond Grid's RowDefinition and ColumnDefinition mouse was // over when double clicked! } } 

Здесь дается ответ: способы определить, какая ячейка была нажата на WPF Grid?

Я никогда не использовал WPF Grid раньше, хотя, используя эту ссылку выше, в качестве примера я думаю, что что-то вроде этого должно это сделать:

Добавьте это в свой метод Initialize:

 this.GridCtrl.MouseDown += new MouseButtonEventHandler(GridCtrl_MouseDown); 

И добавьте новый метод обработки события:

 private void GridCtrl_MouseDown(object sender, MouseButtonEventArgs e) { if (sender != null) { Grid _grid = sender as Grid; int _row = (int)_grid.GetValue(Grid.RowProperty); int _column = (int)_grid.GetValue(Grid.ColumnProperty); MessageBox.Show(string.Format("Grid clicked at column {0}, row {1}", _column, _row)); } } 

Я использую что-то вроде этого:

 private void DataGrid1_MouseDoubleClick(object sender, MouseButtonEventArgs e) { // Check if the user double-clicked a grid row and not something else if (e.OriginalSource == null) return; var row = ItemsControl.ContainerFromElement((DataGrid)sender, e.OriginalSource as DependencyObject) as DataGridRow; // If so, go ahead and do my thing if (row != null) { var Item = (CLASS_YOU_USE_TO_BIND)DataGrid1.Items[row.GetIndex()]; //Here you can work with Item, it is now the object of class you used in //DataGrid.DataSource } } 

просто попробуйте это

 Grid.GetRow(NAME OF GRID) Grid.GetColumn(NAME OF GRID)