2010-03-12 75 views
2

我有以下情況:如何在XAML中的特定位置觸發路由事件?

stackpanel包含一些元素,包括一些包含在GroupBox中的元素。因此,像這樣:

<StackPanel x:Name="stackpanel" Background="White"> 
    <TextBlock Text="TextBlock"/> 
    <TextBlock Text="Another TextBlock"/> 
    <!--plus a load of other elements and controls--> 

    <GroupBox Header="GroupBoxHeader"> 
     <TextBlock Text="Text inside GroupBox"/> 
    </GroupBox> 

</StackPanel> 

我想的MouseDown在StackPanel中引發一些故事板,所以我增加了一個EventTrigger,如下所示:

<EventTrigger RoutedEvent="Mouse.MouseDown" SourceName="stackpanel"> 
    <BeginStoryboard Storyboard="{StaticResource OnMouseDown1}"/> 
</EventTrigger> 

這幾乎是正確的,但事情是 - 我不希望MouseDown被GroupBox的標題或邊框拾取,只能通過其內容拾取。換句話說,當有人對StackPanel內的任何東西進行了mousedown時,我想讓Storyboard開始,除了GroupBox標題和邊框。

有沒有這樣做的一些方法? (我已經嘗試在GroupBox上設置e.Handled爲true,但是它的內容不再接受mousedown。)

回答

5

您正處在正確的軌道上。在GroupBox處理程序中,只有當它不是您想要觸發的選項之一時,纔會將e.Handled設置爲true。一個簡單的技巧就是發件人是指定處理程序的對象,但e.Source是事件實際發生的地方。例如,如果我這樣做:

private void GroupBox_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     if (e.Source.Equals(sender)) 
     { 
      //It comes from the groupbox, including the header 
      e.Handled = true; 
     } 
     else 
     { 
      e.Handled = false; 
     } 
    } 

如果事件來自GroupBox的其中一個子項,則該事件僅到達父項。源於GroupBox本身(包括頭部)的那些被壓縮。

+0

正是我在找的東西。謝謝! – cfouche 2010-03-12 15:04:59

相關問題