我对 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 会阻止我的 routedevent?
编辑:
代码工作正常,但当我将 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));
}
}
如果我将 OmaEvent 放在 ToggleButton 中,它永远不会触发。如果我不把它放在 ToggleButton 里面,它就可以工作。
最佳答案
Oma
事件没有被引发,因为父 ToggleButton
在其 ButtonBase.OnMouseLeftButtonDown
方法中窃取了鼠标捕获,该方法被调用 < em>在 OnMouseDown
方法之后。只要 ToggleButton
具有鼠标捕获功能,其他元素就不会收到鼠标事件,因此您的标签不会收到 MouseUp
事件,而您的 OnMouseUp
方法不会被调用。
在 OnMouseDown
方法中设置 e.Handled = true;
以防止事件冒泡到 ToggleButton
。这将防止它窃取焦点,但它也会阻止按钮在单击 MyLabel
时正常工作。不清楚您希望在这种情况下采取什么行为。
关于c# - WPF RoutedEventHandler 不适用于内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27389469/