我想这样做:
https://github.com/rails/rails/commit/f50aeda2f73b47c47664e3651c638ba624418b8b
当您的鼠标光标移动到源代码行上时,如何在表格的左侧显示图像/按钮?这一点。
所以我有一个Grid,RowDefinition有MouseEnter和MouseLeave事件。事实证明这些事件是无用的,永远无法触发(如果我错了,请纠正我),因为它们需要Background属性(即使它是透明的),而RowDefinition没有Background属性。
我不能只在每个单元格中的每个元素上挂钩MouseEnter,因为当我移动鼠标时,新显示的按钮已经消失了。
我怎样才能使这个工作?
答案 0 :(得分:2)
RowDefinitions
和ColumnDefinitions
实际上并不在Visual Tree中,因为它们是FrameworkContentElements
(而不是FrameworkElements
),这就是为什么它们不会引发任何鼠标事件,他们不是Visuals
。它们仅由Grid
用于定位其子项。
我们想到的一种方法是使用Mouse.MouseMove
上的附加事件Mouse.MouseLeave
和Grid
,以便在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
Image
与MouseOverRowDefinition
进行比较{ {1}}决定是否Grid
。
如果您想尝试一下,请上传一个小样本应用程序来执行此操作:
http://dl.dropbox.com/u/39657172/MouseOverGridRowDefinition.zip