RaiseEvent不触发自定义路由事件。

4
这是我第一次尝试定义自己的路由事件。当我调试这个项目时,一旦将鼠标悬停在椭圆形上,就会触发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>

你是否正确引发它?我自己没有这样做过,但似乎你必须使用构造函数的其中一个重载来传递标识路由事件的参数。 - Sinatr
@Sinatr:我会尝试一下。但是这个框架(Thumb控件)和我上面的方法完全一样。 - oliver
1个回答

1
问题在于您正在重用原本属于另一个路由事件 Thumb.DragDeltaEventDragDeltaEventArgs。因此,当您执行以下操作时:
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);

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

啊,我错过了DragDeltaEventArgs实际上只引用了Thumb!乍一看,它看起来就像一个无害的类。棘手... - oliver
非常感谢,现在它可以正常工作了。难以置信我竟然希望RaiseEvent在不告诉它要触发哪个事件的情况下完成其工作!!!:-))) - oliver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接