Туннель RoutedEvent не достигает дочернего элемента

Я нашел много примеров, объясняющих всплытие, но ни один из них не касается туннелирования, это касается туннелирования, например, от родителя к ребенку. Я думаю, что моя главная проблема в том, что я не понимаю, как зарегистрировать маршрутизируемое событие в дочернем элементе (WindowControl в UserControl). Я получил:

public partial class MyParent : UserControl
{
  public static readonly RoutedEvent RoutedMouseUpEvent = EventManager.RegisterRoutedEvent(
        "PreviewMouseLeftButtonUp", RoutingStrategy.Tunnel, typeof(RoutedEventHandler),   typeof(WindowControl)); 

// Provide CLR accessors for the event        
public event RoutedEventHandler MouseUp
{
  add { AddHandler(RoutedMouseUpEvent, value); }
  remove { RemoveHandler(RoutedMouseUpEvent, value); }
}

public addView(UserControl view)
{
WindowControl win = new WindowControl();
win.Content = view;
}

private void Grid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
  RoutedEventArgs newEventArgs = new RoutedEventArgs(MyParent.RoutedMouseUpEvent);
            RaiseEvent(newEventArgs);
}
}

Необходима инкапсуляция addView, не должно быть проблем? Ребенок добавляется через addView. Вызывается Grid_MouseLeftButtonUp.
Получатель выглядит так (это mvvm, так что не так много):

public partial class ChildView : UserControl
{
 void UserControl_PreviewMouseLeftButtonUp(object sender, RoutedEventArgs args)
 {
    int i = 0; // The breakpoint is never called
 }
}

в XAML

<Grid>
   <Border BorderBrush="black" BorderThickness="1" HorizontalAlignment="Center"   VerticalAlignment="Center" PreviewMouseLeftButtonUp="UserControl_PreviewMouseLeftButtonUp">
</Border>
</Grid>

Если я что-то забыл, пожалуйста, дайте мне знать. Проблема в том, что перенаправленное событие не достигает UserControl_PreviewMouseLeftButtonUp


person Martin    schedule 20.11.2012    source источник


Ответы (1)


Это не то, как работает стратегия туннельной маршрутизации. Туннелирование означает, что событие начнется с корня и пойдет по пути дерева к вызывающему элементу управления. Например, если у нас есть следующее визуальное дерево

Window
|
|--> SomeUserControl
|--> MyParent
     |
     |--> ChildView

затем, если MyParent вызовет событие туннелирования, событие туннелирования посетит:

  1. Окно
  2. Мой родитель

и НЕ

  1. Мой родитель
  2. Детский вид

Подводя итог, всплывающие события всегда будут начинаться с элемента управления, вызывающего событие, и останавливаться в корне визуального дерева, в то время как события туннелирования будут начинаться с корня визуального дерева и заканчиваться элементом управления, вызывающим событие (тот же самый путь, только в обратном порядке).

EDIT: вы можете прочитать больше о перенаправленных событиях в MSDN's Routed Обзор событий. У него также есть хорошее изображение, демонстрирующее это:

введите здесь описание изображения

person Adi Lester    schedule 20.11.2012
comment
Я не понимаю. Почему я не могу просто сказать программе, что MyParent является корнем? - person Martin; 20.11.2012
comment
Теперь я понимаю. Туннелирование не может добраться до моего ребенка, что, на мой взгляд, делает его совершенно бесполезным. Я читал эти доки, но как-то не так понял. Я решу свою проблему, используя интерфейсы и просто передавая данные (это был план Б). Спасибо за отличное объяснение. - person Martin; 20.11.2012
comment
Туннелирование не бесполезно, оно просто используется для другой задачи, чем та, которую вы пытаетесь выполнить. Например, его можно использовать для запрета ввода определенных символов в TextBox путем захвата нажатий клавиш и отмены события до того, как оно достигнет TextBox. - person Adi Lester; 20.11.2012