单击鼠标获取网格单元格

Sha*_*hai 9 c# wpf

我有一个分为3行和3列的WPF网格,我无法找到一种方法来获取鼠标点击网上的行和列号,哦,如果有可能它会更好我的程序,这部分将在代码而不是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>
Run Code Online (Sandbox Code Playgroud)

mar*_*mnl 8

面对同样的问题,我提出了这个解决方案:

XAML:

<Grid Name="myGrid" Background="Transparent" PreviewMouseLeftButtonDown="OnPreviewMouseLeftButtonDown">
Run Code Online (Sandbox Code Playgroud)

注意:Grid必须给出一个背景来提升鼠标按下事件,请参阅:当单击单元格中没有UIElemets时,如何让Grid提升MouseDown事件?

代码隐藏:

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!
    }
}
Run Code Online (Sandbox Code Playgroud)


mse*_*dio 0

此处回答:WPF Grid 上如何识别哪个单元格被单击?

我以前从未使用过 WPF Grid,尽管使用上面的链接作为示例,我认为类似的操作应该可以做到这一点:

将其添加到您的初始化方法中:

this.GridCtrl.MouseDown += new MouseButtonEventHandler(GridCtrl_MouseDown);
Run Code Online (Sandbox Code Playgroud)

并添加新方法来处理该事件:

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));
    }
}
Run Code Online (Sandbox Code Playgroud)