C# WPF RoutedEventHandler无法处理内容
我对c#WPF RouteEvent有问题。此代码工作正常:C# WPF RoutedEventHandler无法处理内容,c#,wpf,routedevent,C#,Wpf,Routedevent,我对c#WPF RouteEvent有问题。此代码工作正常: MyLabel myLabel = new MyLabel();//MyOwn component myLabel.Oma += new RoutedEventHandler(myLabel_Click); GameArea.Children.Add(mylabel);//GameArea is UniformGrid 但当我将myLabel放入ToggleButton的内容中时,ro
MyLabel myLabel = new MyLabel();//MyOwn component
myLabel.Oma += new RoutedEventHandler(myLabel_Click);
GameArea.Children.Add(mylabel);//GameArea is UniformGrid
但当我将myLabel放入ToggleButton的内容中时,routedeventhandler(myLabel_Click)无法捕获Oma事件(我调试了该事件):
那么为什么ToggleButton会阻止我的routedevent呢
编辑:
代码工作正常,但当我将myLabel放入ToggleButton的内容时,它会带来麻烦。MyLabel中的事件如下所示:
public static readonly RoutedEvent OmaEvent =
EventManager.RegisterRoutedEvent("Oma", RoutingStrategy.Bubble,
typeof(RoutedEventHandler), typeof(MyLabel));
public event RoutedEventHandler Oma
{
add { AddHandler(OmaEvent, value); }
remove { RemoveHandler(OmaEvent, value); }
}
protected override void OnMouseDown(MouseButtonEventArgs e)
{
base.OnMouseDown(e);
CaptureMouse();
}
protected override void OnMouseUp(MouseButtonEventArgs e)
{
base.OnMouseUp(e);
if (IsMouseCaptured)
{
ReleaseMouseCapture();
if (IsMouseOver)
RaiseEvent(new RoutedEventArgs(OmaEvent, this));
}
}
如果我把它放在开关按钮里,它永远不会升起。如果我不把它放在切换按钮里,它就会工作 听起来您的自定义
Oma
事件可能与您尝试执行的操作不匹配
如果Oma
事件是设置为Direct
的RoutedEvent,并且MyLabel
类的类型为UIElement
,则您应该能够执行以下操作:
GameArea.Children.Add(box);//GameArea is UniformGrid
GameArea.AddHandler(Oma, new RoutedEventHandler(myLabel_Click));
未引发
Oma
事件,因为父级ToggleButton
在其ButtonBase.OnMouseLeftButtonDown
方法中窃取鼠标捕获,该方法在OnMouseDown
方法后被调用。只要ToggleButton
具有鼠标捕获功能,其他元素就不会接收鼠标事件,因此标签不会接收MouseUp
事件,并且不会调用OnMouseUp
方法
设置
e.Handled=true使用OnMouseDown
方法中的code>,以防止事件冒泡到ToggleButton
。这将防止它窃取焦点,但也会阻止在单击内的MyLabel
时按钮正常工作。目前尚不清楚在这种情况下您想要什么行为。您可以共享MyLabel类和Oma事件代码吗?您可以验证当标签放置在切换按钮中时,OmaEvent
是否确实被引发吗?在标签的OnMouseUp
method.OmaEvent中设置一个断点,如果我将它放在ToggleButton中,它将永远不会引发。如果我不把它放在切换按钮里,它就会工作。
GameArea.Children.Add(box);//GameArea is UniformGrid
GameArea.AddHandler(Oma, new RoutedEventHandler(myLabel_Click));