我有一个网格,其中有两个重叠的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可以使用常规的隧道化和冒泡功能?
我如何以自然方式将事件发送给两者控件(因此没有强制命令完全取代事件系统)?