In a custom FrameworkElement (a Shape) I have:

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" />

The AddHandler above is not invoked when the shapes (in a DataTemplate) are created.
I never receive the event in code behind when I fire it in my shape by:

RaiseEvent(new DragDeltaEventArgs(...);
有帮助吗?

解决方案

Typical code for eventhandler definition and corresponding eventarguments are:

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);

I reused code from the frameworks Thumb class to create a kind of "thumb" shape.
But you then cannot reuse the eventhandlers and event-arguments, because they are specifically for the Thumb class.

When you use a regular Shape as a DataTemplate and surrond it with a regular Thumb the dragging becomes often irregular (comp. this question). Trying to repair that behaviour.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top