2012-07-04 2 views
1

Я в настоящее время экспериментирую с настраиваемыми событиями на C# WPF, которые я застрял в проблеме. Это то, что я хочу сделать: я хочу запустить настраиваемое маршрутизируемое событие из моего главного окна, которое туннелируется через стекную панель в пользовательский элемент управления, полученный классом Button. Затем настраиваемый элемент обрабатывает маршрутизируемое событие.Обработка туннелированного пользовательского маршрутизируемого события

Моя проблема в том, когда я запускаю событие, которое обработчик никогда не вызывал.

Мой код:

public partial class MainWindow : Window 
     { 

     public static readonly RoutedEvent MyRoutedEvent = EventManager.RegisterRoutedEvent("MyRoutedEvent", RoutingStrategy.Tunnel, typeof(RoutedEventHandler), typeof(UIElement)); 

     public static void AddMyRoutedEventHandler(DependencyObject d, RoutedEventHandler handler) 
     { 
      UIElement uie = d as UIElement; 
      if (uie != null) 
      { 
       uie.AddHandler(MainWindow.MyRoutedEvent, handler); 
      } 
     } 

     public static void RemoveMyRoutedEventHandler(DependencyObject d, RoutedEventHandler handler) 
     { 
      UIElement uie = d as UIElement; 
      if (uie != null) 
      { 
       uie.RemoveHandler(MainWindow.MyRoutedEvent, handler); 
      } 
     } 


     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void keyClassButton1_MyRoutedEvent(object sender, RoutedEventArgs e) 
     { 
      Console.Write("\nMyRoutedEvent!"); 
     } 

     private void Window_MouseDown(object sender, MouseButtonEventArgs e) 
     { 
      RoutedEventArgs newEventArgs = new RoutedEventArgs(MyRoutedEvent, this); 
      RaiseEvent(newEventArgs); 
     } 
    } 

код XAML:

<Window x:Class="RoutedEvent_Test.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:RoutedEvent_Test" 
     Title="MainWindow" Height="350" Width="525" MouseDown="Window_MouseDown"> 
    <Grid> 
     <StackPanel Name="stackPanel1"> 
      <local:KeyClass x:Name="keyClass1" Content="key class button" Height="30" local:MainWindow.MyRoutedEvent="keyClassButton1_MyRoutedEvent"></local:KeyClass> 
     </StackPanel> 
    </Grid> 
</Window> 

ответ

0

Эта регистрация не кажется правильным:

public static readonly RoutedEvent MyRoutedEvent = EventManager.RegisterRoutedEvent("MyRoutedEvent", RoutingStrategy.Tunnel, typeof(RoutedEventHandler), typeof(UIElement)); 

Вы должны добавить public event ReoutedEventHandler MyRoutedEvent в классе как вы зарегистрировались здесь. Это должен быть обработчик уровня нестатического класса. Я не вижу этого в вашем коде.

Вам нужно нужно что-то вроде этого на MainWindow:

public event RoutedEventHandler MyRoutedEvent; 

See MSDN example here.

2

хорошо я понял это сам: Хотя я читал ее, как тысячу раз ясно говорится в MSDN:

Туннелирование: Первоначально обработчики событий у корня элемента дерева вызываются . Затем маршрутизируемое событие отправляет маршрут через последовательных дочерних элементов по маршруту, к элементу узла, который является источником маршрутизируемого события (элемент, который поднял маршрутизируемое событие). [...]

Моей первая идеей туннеля перенаправленного события было: я огнь события из главного окна и проходит через StackPanel к кнопочному элементу. BUT INSTEAD: Вы должны запустить его с кнопки уже - тогда он начинается с корневого элемента (главного окна) и проходит через уровни управления к элементу кнопки, который в первую очередь запускает это событие.

Что я сделал: я уволил событие из главного окна, чтобы он не мог никуда уйти

Смежные вопросы