RowDefinitionsとColumnDefinitionsはFrameworkContentElements( ではなく) であるため、実際にはビジュアル ツリーにはありません。FrameworkElementsそのため、マウス イベントは発生しませんVisuals。それらは、Gridその子を配置するために によって使用されるだけです。
頭に浮かぶ 1 つのアプローチは、添付イベントを使用してMouse.MouseMove、Mouse.MouseLeaveまたは自体のGrid子に対してこれらのイベントが発生したときに通知を受け取ることです。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);
}
これで をクエリできるGridのでMouseOverRowDefinition、あとは と を比較Grid.Rowして、ImageそうMouseOverRowDefinitionすGridべきかどうかを判断するだけVisibleです。
試してみたい場合は、これを行う小さなサンプル アプリをここにアップロードしました:
http://dl.dropbox.com/u/39657172/MouseOverGridRowDefinition.zip