2011-06-09 81 views
9

我有以下XAML爲什麼e.Handled = true不工作?

<StackPanel MouseEnter="StackPanel_MouseEnter" Height="130" Background="Blue"> 
    <Grid MouseEnter="Grid_MouseEnter" Height="60" Background="Red" > 
     <Button MouseEnter="Button_MouseEnter" Height="20"/> 
    </Grid> 
</StackPanel> 

在後面的代碼我這樣做

private void StackPanel_MouseEnter(object sender, MouseEventArgs e) 
{ 

} 

private void Grid_MouseEnter(object sender, MouseEventArgs e) 
{ 
    e.Handled = true; 
} 

private void Button_MouseEnter(object sender, MouseEventArgs e) 
{ 
    e.Handled = true; 
} 

現在,即使我鼠標移到Button並設置e.Handled = trueGridStackPanel事件分別被稱爲。爲什麼?我應該怎麼做才能阻止路由事件冒泡?

回答

10

MouseEnter事件不是一個冒泡事件,它是一個直接事件(就像傳統的CLR事件)。從documentation

可以定義爲XAML內容對象多的MouseEnter 事件。 但是,如果子對象及其父對象都定義了MouseEnter 事件,則父對象的MouseEnter 事件發生在子對象的 MouseEnter事件之前。這不是一個冒泡事件的案例 ;它僅指示 鼠標(或手寫筆)已經輸入了 兩個對象,可能在不同的 時間,這取決於可視化樹的佈局和 組成。

所以你不能阻止它被父母解僱。您可以使用IsMouseDirectlyOver屬性來查看鼠標實際上是否僅在給定元素上。

+1

關於您的用戶名中的提案,我第二個議案! – Qwertie 2011-06-09 17:49:21