4

我想做这个:

https://github.com/rails/rails/commit/f50aeda2f73b47c47664e3651c638ba624418b8b

看看,当您的鼠标光标在源代码行上移动时,一个图像/按钮会出现在表格的左侧吗?那。

所以我有一个网格,RowDefinition 有 MouseEnter 和 MouseLeave 事件。事实证明这些事件是无用的并且永远不会触发(如果我在这里错了,请纠正我),因为它们需要一个 Background 属性(即使它是透明的),而 RowDefinition 没有 Background 属性。

我不能只在每个单元格中的每个元素上挂上 MouseEnter,因为当我移动鼠标时,新可见的按钮已经消失了。

我怎样才能得到这个工作?

4

1 回答 1

2

和实际上不在可视树中,因为它们是RowDefinitions(而不是),这就是为什么它们不引发任何鼠标事件,它们不是。它们只是被用来定位它的孩子。ColumnDefinitionsFrameworkContentElementsFrameworkElementsVisualsGrid

想到的一种方法是使用附加事件Mouse.MouseMove,并Mouse.MouseLeaveGrid为任何孩子引发这些事件时得到Grid通知Grid

<Grid Mouse.MouseMove="Grid_MouseMove"
      Mouse.MouseLeave="Grid_MouseLeave"
      Background="Transparent">

Mouse.MouseMove事件处理程序中,我们可以获得相对于 的鼠标位置,Grid并计算RowDefinition当前被鼠标悬停的位置,并将其存储在附加属性中,例如MouseOverRowDefinition.

private void Grid_MouseMove(object sender, MouseEventArgs e)
{
    Grid grid = sender as Grid;
    Point mousePoint = e.GetPosition(grid);
    double heightSum = grid.RowDefinitions[0].ActualHeight;
    int activeRow = 0;
    for (; heightSum < mousePoint.Y; activeRow++)
    {
        heightSum += grid.RowDefinitions[activeRow].ActualHeight;
    }
    GridExtensions.SetMouseOverRowDefinition(grid, activeRow);
}
// No RowDefinition is beeing hoovered, set MouseOverRowDefinition to -1
private void Grid_MouseLeave(object sender, MouseEventArgs e)
{
    Grid grid = sender as Grid;
    GridExtensions.SetMouseOverRowDefinition(grid, -1);
}

现在我们可以查询 the Grid,所以剩下的MouseOverRowDefinition只是比较toGrid.Row来决定它是否应该。ImageMouseOverRowDefinitionGridVisible

如果您想尝试一下,请在此处上传一个小型示例应用程序:http:
//dl.dropbox.com/u/39657172/MouseOverGridRowDefinition.zip

于 2011-09-09T21:38:25.570 回答