我有以下情况:
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。)
答案 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本身(包括标题)的那些被抑制。