和实际上不在可视树中,因为它们是RowDefinitions
(而不是),这就是为什么它们不引发任何鼠标事件,它们不是。它们只是被用来定位它的孩子。ColumnDefinitions
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);
}
现在我们可以查询 the Grid
,所以剩下的MouseOverRowDefinition
只是比较toGrid.Row
来决定它是否应该。Image
MouseOverRowDefinition
Grid
Visible
如果您想尝试一下,请在此处上传一个小型示例应用程序:http:
//dl.dropbox.com/u/39657172/MouseOverGridRowDefinition.zip