Получить ячейку сетки с помощью мыши - PullRequest
9 голосов
/ 15 июня 2011

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

  <Grid Name="GridCtrl" ShowGridLines="True">
     <Grid.RowDefinitions>
        <RowDefinition Height="3*" />
        <RowDefinition Height="3*" />
        <RowDefinition Height="3*" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="3*" />
        <ColumnDefinition Width="3*" />
        <ColumnDefinition Width="3*" />
   </Grid.ColumnDefinitions>
  </Grid>

Ответы [ 4 ]

8 голосов
/ 11 декабря 2013

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

XAML:

<Grid Name="myGrid" Background="Transparent" PreviewMouseLeftButtonDown="OnPreviewMouseLeftButtonDown">

ПРИМЕЧАНИЕ: 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!
    }
}
1 голос
/ 15 июня 2011

Здесь ответили: Способы определения, какая ячейка была нажата в 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));
    }
}
0 голосов
/ 22 сентября 2016

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

Grid.GetRow(NAME OF GRID)
Grid.GetColumn(NAME OF GRID)
0 голосов
/ 27 июля 2011

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

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
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...