在WPF网格中,如何在鼠标位置找到行和列?

Wil*_*lka 8 wpf grid mouseevent

我有一个Grid带有一些行和列的WPF ,例如

<Grid Name="myGrid" MouseMove="OnMouseMove">
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>

    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
</Grid>
Run Code Online (Sandbox Code Playgroud)

使用MouseMove.cs文件中的处理程序,例如

private void OnMouseMove(object sender, MouseEventArgs e)
{
    var position = e.GetPosition(myGrid);

    // What row & col is the mouse over?
}
Run Code Online (Sandbox Code Playgroud)

我希望能够找到鼠标结束的网格中的哪一行和哪一列,这可能吗?

[注意:这是问题的简化版本,因此以这种方式呈现它看起来有点奇怪 - 它是网格功能之间的一些拖放的一部分]

Nic*_*las 17

我希望你已经找到了解决方案.我遇到了同样的问题,我找到了这个无人接听的帖子.所以我认为下一个会很乐意找到这个解决方案:

private void OnMouseMove(object sender, MouseEventArgs e)
{
    var element = (UIElement)e.Source;

    int c = Grid.GetColumn(element);
    int r = Grid.GetRow(element);
}
Run Code Online (Sandbox Code Playgroud)

  • 这只适用于每个单元格中有UIElements的情况.所以这个问题没有答案. (5认同)

小智 5

这可以完成以下操作(但不应在较大的网格上使用).它仅适用于Rows,但第二个循环可以应用于列...

Nicolas的答案只有在网格包含一些UIElements(它们在网格中的位置被确定 - 我想如果一个元素跨越几行/列时也会造成麻烦)时才有效.

    private void ItemsGrid_MouseMove(object sender, MouseEventArgs e)
    {
        double y = e.GetPosition(ItemsGrid).Y;
        double start = 0.0;
        int row = 0;
        foreach(RowDefinition rd in ItemsGrid.RowDefinitions)
        {
            start += rd.ActualHeight;
            if (y < start)
            {
                break;
            }
            row++;
        }
        System.Diagnostics.Debug.WriteLine("Row : " + row);
    }
Run Code Online (Sandbox Code Playgroud)