是否有两个重叠的控件收到相同的点击事件?

时间:2019-04-05 08:04:58

标签: c# wpf xaml

我有一个网格,其中有两个重叠的UserControl:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>
    <ControlA Grid.Row="0" Grid.Column="1"
              Grid.RowSpan="2"
              Canvas.ZIndex="1"
              Background="Transparent"/>
    <ControlB Grid.Row="1" Grid.Column="0"
              Grid.ColumnSpan="2"/>
</Grid>

两者都具有单击和滚动行为,并监听MouseDown / MouseWheel事件,ControlB还拥有自己的带有子控件的VisualTree,该控件应接收那些隧道和冒泡事件(ControlA相当简单,但仍然需要那些事件)。

单击非重叠部分可以正常工作,并且可以正常使用,但是当我单击重叠部分时,只能让其中一个接收事件,而不能同时接收两个事件。

我试图捕获Preview-Events并将它们委托给子控件,但是直到现在我还没有找到一种根本不会导致任何行为或StackOverFlow的方法。

//Does not work
private void OnPreviewMouseDown(object sender, MouseButtonEventArgs e)
    {
        ControlA.RaiseEvent( new MouseButtonEventArgs(e.MouseDevice, e.Timestamp, MouseButton.Left){RoutedEvent = MouseDownEvent} );
        ControlB.RaiseEvent( new MouseButtonEventArgs(e.MouseDevice, e.Timestamp, MouseButton.Left){RoutedEvent = MouseDownEvent} );
    }

我是否必须手动实现VisualTreeHelper.HitTest()并通过可视化树?我是否必须使ControlA的背景图像为null并为其强制事件(因为它缺少子级的VisualTree),而ControlB可以使用常规的隧道化和冒泡功能?

我如何以自然方式将事件发送给两者控件(因此没有强制命令完全取代事件系统)?

0 个答案:

没有答案