2011-09-09 54 views
4

我想這樣做:的MouseEnter /鼠標離開上RowDefinition

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

見怎麼樣,因爲你的鼠標光標移動過的源代碼行,圖像/按鈕出現在表的左邊?那。

所以我有一個網格,RowDefinition有MouseEnter和MouseLeave事件。事實證明,這些事件是無用的,並且永遠不會開火(如果我在這裏錯誤,請糾正我),因爲它們需要一個Background屬性(即使它是透明的),並且RowDefinition沒有Background屬性。

我不能只在每個單元格的每個元素上掛上MouseEnter,因爲當我移動鼠標時,新顯示的按鈕已經消失。

我該如何得到這個工作?

回答

2

RowDefinitionsColumnDefinitions實際上不是在Visual樹,因爲它們是FrameworkContentElements(而不是FrameworkElements),這就是爲什麼他們不提出任何鼠標事件,他們不是Visuals。他們只是用Grid來定位它的孩子。浮現在腦海

一種方法是使用附帶的活動上GridMouse.MouseMoveMouse.MouseLeave當這些事件被觸發在GridGrid本身的任何孩子得到通知。

<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); 
} 

現在,我們可以查詢GridMouseOverRowDefinition所以剩下的只是一個爲Image比較Grid.RowMouseOverRowDefinitionGrid,以決定是否應該Visible與否的問題。

上傳一個小樣本的應用程序,如果你想嘗試一下,在這裏做這個的:
http://dl.dropbox.com/u/39657172/MouseOverGridRowDefinition.zip

+0

感謝示例項目!我仍然試圖讓多重綁定xaml在代碼中工作,但我有點失落...... – epalm

相關問題