RowDefinition上的MouseEnter / MouseLeave

时间:2011-09-09 16:02:46

标签: c# wpf grid mouseenter

我想这样做:

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

当您的鼠标光标移动到源代码行上时,如何在表格的左侧显示图像/按钮?这一点。

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

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

我怎样才能使这个工作?

1 个答案:

答案 0 :(得分:2)

RowDefinitionsColumnDefinitions实际上并不在Visual Tree中,因为它们是FrameworkContentElements(而不是FrameworkElements),这就是为什么它们不会引发任何鼠标事件,他们不是Visuals。它们仅由Grid用于定位其子项。

我们想到的一种方法是使用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);
}

现在我们可以查询Grid MouseOverRowDefinition,以便其余只是将Grid.Row ImageMouseOverRowDefinition进行比较{ {1}}决定是否Grid

如果您想尝试一下,请上传一个小样本应用程序来执行此操作:
http://dl.dropbox.com/u/39657172/MouseOverGridRowDefinition.zip