如何阻止路由事件触发XAML中的特定位置?

2 wpf events 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>
Run Code Online (Sandbox Code Playgroud)

我想在stackpanel中使用MouseDown来触发一些Storyboard,所以我添加了一个EventTrigger,如下所示:

<EventTrigger RoutedEvent="Mouse.MouseDown" SourceName="stackpanel">
    <BeginStoryboard Storyboard="{StaticResource OnMouseDown1}"/>
</EventTrigger>
Run Code Online (Sandbox Code Playgroud)

这几乎是正确的,但问题是 - 我不希望MouseBox被GroupBox的标题或边框拾取,只能通过其内容.换句话说,当有人在StackPanel内的任何内容上进行mousedown时,我希望故事板开始,除了GroupBox标题和边框.

有没有办法做到这一点?(我已经尝试在GroupBox上将e.Handled设置为true,但是它的内容也不再是mousedown.)

Ben*_*orf 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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

如果事件来自GroupBox的其中一个子节点,则该事件仅到达父节点.源自GroupBox本身(包括标题)的那些被抑制.