C# RaiseEvent不触发自定义路由Event
这是我第一次尝试定义自己的RouteEvent。当我调试这个项目时,只要我将鼠标悬停在椭圆形状上,OnMouseMove就会到达,但是RaiseEvent什么也不做。甚至不可能单步进入RaiseEvent查看出了什么问题(调试器只是单步执行) 控制: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;
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在不告诉它应该举办哪项活动的情况下完成它的工作!!!:-)