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

时间:2010-03-12 08:30:41

标签: 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>

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

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

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

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

1 个答案:

答案 0 :(得分: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本身(包括标题)的那些被抑制。