的RowDefinitions
和ColumnDefinitions
實際上不是在Visual樹,因爲它們是FrameworkContentElements
(而不是FrameworkElements
),這就是爲什麼他們不提出任何鼠標事件,他們不是Visuals
。他們只是用Grid
來定位它的孩子。浮現在腦海
一種方法是使用附帶的活動上Grid
Mouse.MouseMove
和Mouse.MouseLeave
當這些事件被觸發在Grid
或Grid
本身的任何孩子得到通知。
<Grid Mouse.MouseMove="Grid_MouseMove"
Mouse.MouseLeave="Grid_MouseLeave"
Background="Transparent">
在Mouse.MouseMove
事件處理程序中,我們可以得到相對的鼠標位置到Grid
並計算其RowDefinition
目前正由鼠標hoovered並存儲在附加屬性,如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
所以剩下的只是一個爲Image
比較Grid.Row
到MouseOverRowDefinition
爲Grid
,以決定是否應該Visible
與否的問題。
上傳一個小樣本的應用程序,如果你想嘗試一下,在這裏做這個的:
http://dl.dropbox.com/u/39657172/MouseOverGridRowDefinition.zip
感謝示例項目!我仍然試圖讓多重綁定xaml在代碼中工作,但我有點失落...... – epalm