2014-02-21 5 views
0

В пользовательской FrameworkElement (форма) у меня есть:Что мне не хватает с этим RoutedEvent?

public static readonly RoutedEvent DragDeltaEvent = EventManager.RegisterRoutedEvent("DragDelta", RoutingStrategy.Bubble, typeof(DragDeltaEventHandler), typeof(MyShape)); 
public event DragDeltaEventHandler DragDelta { add { AddHandler(DragDeltaEvent, value); } remove { RemoveHandler(DragDeltaEvent, value); } } 

// xaml DataTemplate: 
    <local:MyShape DragDelta="MyShape_DragDelta" /> 

AddHandler выше не вызывается при создании формы (в DataTemplate).
я никогда не получить событие в коде позади, когда я стрелять в моей форме по:

RaiseEvent(new DragDeltaEventArgs(...); 
+1

'AddHandler' не вызывается, потому что WPF будет вызывать его напрямую, а не через оболочку, такую ​​же, как' SetValue'/'GetValue' для' DependencyProperty', но кроме этого он должен работать. По крайней мере, он работает здесь, на моем примере – dkozl

+0

О да, это имеет смысл. Но в моем случае 'RaiseEvent' не доходит до обработчика' MyShape_DragDelta' в коде позади. – Gerard

+0

Итак, где-то внутри 'MyShape' у вас есть' RaiseEvent (новый DragDeltaEventArgs (MyShape.DragDeltaEvent)) ', который, как я предполагаю, вы проверили, выполняется, и' MyShape_DragDelta' не вызывается. – dkozl

ответ

0

Типичный код для определения EventHandler и соответствующие eventarguments являются:

public class DeltaEventArgs : RoutedEventArgs 
{ 
     public DeltaEventArgs(double horizontalChange, double verticalChange) : base() 
     { 
      _horizontalChange = horizontalChange; 
      _verticalChange = verticalChange; 
      RoutedEvent = MyShape.DragDeltaEvent; 
     } 

     public double HorizontalChange 
     { 
      get { return _horizontalChange; } 
     } 

     public double VerticalChange 
     { 
      get { return _verticalChange; } 
     } 

     protected override void InvokeEventHandler(Delegate genericHandler, object genericTarget) 
     { 
      DeltaEventHandler handler = (DeltaEventHandler)genericHandler; 

      handler(genericTarget, this); 
     } 

     private double _horizontalChange; 
     private double _verticalChange; 
    } 

    public delegate void DeltaEventHandler(object sender, DeltaEventArgs e); 

Я повторно код из Thumb рамок класс для создания своего рода «большой» формы.
Но вы не можете повторно использовать обработчики событий и аргументы событий, потому что они специально предназначены для класса Thumb.

Когда вы используете обычную фигуру в качестве DataTemplate и используете ее обычным Thumb, перетаскивание становится часто нерегулярным (comp. this question). Попытка восстановить это поведение.

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