У меня есть сетка с двумя перекрывающимися пользовательскими элементами управления:
<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 как ноль и форсировать события для него (поскольку в нем отсутствует дочернее VisualTree), в то время как ControlB может использовать обычное туннелирование и пузыри?
Как я могу отправлять события в естественном режиме?способ (поэтому никакие принудительные команды полностью не заменяют систему событий) на оба элемента управления?