C# RaiseEvent不触发自定义路由Event

C# RaiseEvent不触发自定义路由Event,c#,wpf,C#,Wpf,这是我第一次尝试定义自己的RouteEvent。当我调试这个项目时,只要我将鼠标悬停在椭圆形状上,OnMouseMove就会到达,但是RaiseEvent什么也不做。甚至不可能单步进入RaiseEvent查看出了什么问题(调试器只是单步执行) 控制: using System; using System.Windows; using System.Windows.Controls; using System.ComponentModel; using System.Windows.Input;

这是我第一次尝试定义自己的RouteEvent。当我调试这个项目时,只要我将鼠标悬停在椭圆形状上,OnMouseMove就会到达,但是RaiseEvent什么也不做。甚至不可能单步进入RaiseEvent查看出了什么问题(调试器只是单步执行)

控制:

using System;
using System.Windows;
using System.Windows.Controls;
using System.ComponentModel;
using System.Windows.Input;
using System.Windows.Controls.Primitives;

namespace TestTrailer2
{
    public class Trailer2: Control
    {
        public static readonly RoutedEvent DragDeltaEvent;

        public event DragDeltaEventHandler DragDelta 
        {
            add {AddHandler(Trailer2.DragDeltaEvent, value);}
            remove {RemoveHandler(Trailer2.DragDeltaEvent, value);}
        }

        static Trailer2()
        {
            Trailer2.DragDeltaEvent = EventManager.RegisterRoutedEvent("DragDelta", RoutingStrategy.Bubble, typeof(DragDeltaEventHandler), typeof(Trailer2));
        }

        protected override void OnMouseMove(MouseEventArgs e)
        {
            base.OnMouseMove(e);
            RaiseEvent(new DragDeltaEventArgs(0, 0));
        }
    }
}
using System;
using System.Windows;

namespace TestTrailer2
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        void Trailer2_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
        {
            throw new NotImplementedException();
        }
    }
}
<Window x:Class="TestTrailer2.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:TestTrailer2"
    Title="TestTrailer2" Height="300" Width="300">
    <Window.Resources>
        <Style TargetType="{x:Type local:Trailer2}">
            <Setter Property="RenderTransformOrigin" Value="0.5,0.5"/>
            <Setter Property="Cursor" Value="Hand"/>
            <Setter Property="Control.Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:Trailer2}">
                    <Ellipse Width="100" Height="100" Fill="#AAD0D0DD"/>
                </ControlTemplate>
            </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>
    <local:Trailer2 DragDelta="Trailer2_DragDelta">
    </local:Trailer2>
</Window>
代码隐藏:

using System;
using System.Windows;
using System.Windows.Controls;
using System.ComponentModel;
using System.Windows.Input;
using System.Windows.Controls.Primitives;

namespace TestTrailer2
{
    public class Trailer2: Control
    {
        public static readonly RoutedEvent DragDeltaEvent;

        public event DragDeltaEventHandler DragDelta 
        {
            add {AddHandler(Trailer2.DragDeltaEvent, value);}
            remove {RemoveHandler(Trailer2.DragDeltaEvent, value);}
        }

        static Trailer2()
        {
            Trailer2.DragDeltaEvent = EventManager.RegisterRoutedEvent("DragDelta", RoutingStrategy.Bubble, typeof(DragDeltaEventHandler), typeof(Trailer2));
        }

        protected override void OnMouseMove(MouseEventArgs e)
        {
            base.OnMouseMove(e);
            RaiseEvent(new DragDeltaEventArgs(0, 0));
        }
    }
}
using System;
using System.Windows;

namespace TestTrailer2
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        void Trailer2_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
        {
            throw new NotImplementedException();
        }
    }
}
<Window x:Class="TestTrailer2.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:TestTrailer2"
    Title="TestTrailer2" Height="300" Width="300">
    <Window.Resources>
        <Style TargetType="{x:Type local:Trailer2}">
            <Setter Property="RenderTransformOrigin" Value="0.5,0.5"/>
            <Setter Property="Cursor" Value="Hand"/>
            <Setter Property="Control.Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:Trailer2}">
                    <Ellipse Width="100" Height="100" Fill="#AAD0D0DD"/>
                </ControlTemplate>
            </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>
    <local:Trailer2 DragDelta="Trailer2_DragDelta">
    </local:Trailer2>
</Window>
标记:

using System;
using System.Windows;
using System.Windows.Controls;
using System.ComponentModel;
using System.Windows.Input;
using System.Windows.Controls.Primitives;

namespace TestTrailer2
{
    public class Trailer2: Control
    {
        public static readonly RoutedEvent DragDeltaEvent;

        public event DragDeltaEventHandler DragDelta 
        {
            add {AddHandler(Trailer2.DragDeltaEvent, value);}
            remove {RemoveHandler(Trailer2.DragDeltaEvent, value);}
        }

        static Trailer2()
        {
            Trailer2.DragDeltaEvent = EventManager.RegisterRoutedEvent("DragDelta", RoutingStrategy.Bubble, typeof(DragDeltaEventHandler), typeof(Trailer2));
        }

        protected override void OnMouseMove(MouseEventArgs e)
        {
            base.OnMouseMove(e);
            RaiseEvent(new DragDeltaEventArgs(0, 0));
        }
    }
}
using System;
using System.Windows;

namespace TestTrailer2
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        void Trailer2_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
        {
            throw new NotImplementedException();
        }
    }
}
<Window x:Class="TestTrailer2.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:TestTrailer2"
    Title="TestTrailer2" Height="300" Width="300">
    <Window.Resources>
        <Style TargetType="{x:Type local:Trailer2}">
            <Setter Property="RenderTransformOrigin" Value="0.5,0.5"/>
            <Setter Property="Cursor" Value="Hand"/>
            <Setter Property="Control.Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:Trailer2}">
                    <Ellipse Width="100" Height="100" Fill="#AAD0D0DD"/>
                </ControlTemplate>
            </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>
    <local:Trailer2 DragDelta="Trailer2_DragDelta">
    </local:Trailer2>
</Window>

问题是您正在重用最初属于另一个路由事件Thumb.DragDeltaEvent的
DragDeltaEventArgs
。所以当你这样做的时候:

RaiseEvent(new DragDeltaEventArgs(0, 0));
真正引发的是Thumb.DragDeltaEvent,而不是自定义事件(请注意,您没有在任何地方声明要引发的事件)。该事件在
DragDeltaEventArgs
构造函数中硬编码

如果要继续重用它,则需要明确说明自定义事件:

var args = new DragDeltaEventArgs(0, 0);
// this is event being raised,
// by default for this routed args its `Thumb.DragDeltaEvent`
args.RoutedEvent = Trailer2.DragDeltaEvent;
RaiseEvent(args);

或者只使用自定义路由事件参数。

是吗?我自己还没有做过,但似乎您必须使用的重载之一传递参数,该参数标识路由事件。@Sinatr:我会试试。但是框架(Thumb控件)的操作方式与我上面所做的完全相同。啊,我没有注意到DragDeltaEventArgs实际上引用了Thumb!乍一看,它看起来就像一个无辜的班级,没有什么特别之处。棘手…非常感谢你。现在可以了。很难相信,我希望RaiseEvent在不告诉它应该举办哪项活动的情况下完成它的工作!!!:-)