鼠标进入/离开 RowDefinition

4

我想做这个:

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

看到了吗,当你的鼠标光标移动到源代码的行上时,左侧会出现一个图像/按钮。就是这个。

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

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

我该如何让它工作?

1个回答

2
RowDefinitionsColumnDefinitions实际上不在可视树中,因为它们是FrameworkContentElements(而不是FrameworkElements),这就是为什么它们不会触发任何鼠标事件,它们不是Visuals。 它们只是被Grid用来定位其子元素的位置。

一个想到的方法是使用附加事件Mouse.MouseMoveMouse.MouseLeaveGrid上,以便在GridGrid中的任何子元素引发这些事件时得到通知。

<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);
}

现在我们可以查询GridMouseOverRowDefinition,所以其余的只是将ImageGrid.RowGridMouseOverRowDefinition进行比较,以决定它是否应该是Visible或不可见。
如果您想尝试,请上传一个小示例应用程序:http://dl.dropbox.com/u/39657172/MouseOverGridRowDefinition.zip

感谢提供示例项目!但我仍在尝试让多绑定的XAML代码正常工作,有些迷茫... - epalm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接