我遇到c#WPF routedevent问题。这段代码工作正常:
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事件(我调试了它):
MyLabel myLabel = new MyLabel();//MyOwn component
myLabel.Oma += new RoutedEventHandler(myLabel_Click);
System.Windows.Controls.Primitives.ToggleButton box = new System.Windows.Controls.Primitives.ToggleButton();
box.Content = myLabel;
GameArea.Children.Add(box);//GameArea is UniformGrid
那么为什么ToggleButton会阻止我的路由器呢?
编辑:
代码工作正常,但是当我把myLabel放在ToggleButton的内容中时会产生麻烦。
MyLabel中的OmaEvent似乎是这样的:
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));
}
}
如果我将它放在ToggleButton中,OmaEvent永远不会加注。如果我不把它放在ToggleButton中,它就可以了。
答案 0 :(得分:0)
听起来您自定义Oma
活动的RoutingStrategy可能与您尝试做的事情不符。
如果Oma
事件是RoutedEvent设置为Direct
,而MyLabel
类的类型为UIElement
,那么您应该可以执行以下操作:
GameArea.Children.Add(box);//GameArea is UniformGrid
GameArea.AddHandler(Oma, new RoutedEventHandler(myLabel_Click));
答案 1 :(得分:0)
Oma
事件未被引发,因为父ToggleButton
在其ButtonBase.OnMouseLeftButtonDown
方法中窃取了鼠标捕获,该方法在 {{1}之后被调用 }} 方法。只要OnMouseDown
有鼠标捕获,就没有其他元素会收到鼠标事件,因此您的标签不会收到ToggleButton
事件,并且您的MouseUp
方法也不会被调用。
在OnMouseUp
方法中设置e.Handled = true;
,以防止事件冒泡到OnMouseDown
。这样可以防止它被窃取焦点,但是当单击ToggleButton
内部时,它也会阻止按钮正常工作。目前还不清楚在这种情况下你想要什么样的行为。