冒泡

2011-10-23 120 views
2

我有這種風格禁用事件:冒泡

 <Style TargetType="{x:Type Expander}"> 
      <Setter Property="BorderBrush" Value="LightGray"/> 
      <Setter Property="Margin" Value="5"/> 

      <EventSetter Event="Mouse.MouseEnter" Handler="ExpanderMouseEnter"/> 
      <EventSetter Event="Mouse.MouseLeave" Handler="ExpanderMouseLeave"/> 
     </Style> 

當我添加一個擴展爲一個孩子的膨脹和鼠標懸停孩子擴展,兩個膨脹的被灰色。我怎樣才能設置e.handled =真正的事件冒泡停止嗎?

編輯:好吧,所以我不得不編輯樣式來調用代碼隱藏方法。下面是方法:

Private Sub ExpanderMouseEnter(ByVal sender As Expander, ByVal e As MouseEventArgs) 
     sender.Background = Brushes.LightGray 
     e.Handled = True 
    End Sub 

    Private Sub ExpanderMouseLeave(ByVal sender As Expander, ByVal e As MouseEventArgs) 
     sender.Background = Brushes.White 
     e.Handled = True 
    End Sub 

但是沒有什麼變化。什麼問題?

回答

2

理想情況下,編寫一個Trigger以更改背景IsMouseDirectlyOver標誌應該工作,因爲此標誌僅用於UIElements激活只觸發鼠標的觸發器。

但似乎失敗擴展,因爲內部擴張是外擴的可視化樹的一部分。

我相信你可能會考慮的是在擴展器的Header元素上有IsMouseOver觸發器。它們互相排斥對方的視覺樹。所以當你將鼠標放在標題上時,擴展器將獲得它們特有的背景顏色。

+0

這適用於HeaderedContentControls,但更一般的情況下,IsMouseDirectlyOver的這個問題會發生在任意嵌套控件(例如按鈕內的Button)上嗎? –

+0

請參閱我的編輯。 –

0

看起來這是不可能使用代碼隱藏的,因爲TriggerEventTrigger(您可以在此方案中替代使用)公開任何相關功能。

除非您可以解決該問題(例如,僅將樣式或其部分應用於後代擴展器),否則必須在代碼隱藏中實現事件處理器,並從那裏設置Handled屬性。

0

我認爲真正的問題是,MouseLeave事件不會觸發時從外擴鼠標移動到內擴展。其結果是,在你的Triggers使用的IsMouseOver屬性保持在兩個設置(在你原來的問題)。因此,即使您在鼠標進入第二個擴展器時可以將Handled屬性設置爲True,您的Trigger仍然會在外部控件和背景設置上處於活動狀態。