WPF RoutedEventHandler 不适用于内容

本文关键字:适用于 不适用 RoutedEventHandler WPF | 更新日期: 2023-09-27 18:33:48

我对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-event(我调试了):

        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));
        }
    }

OmaEvent 永远不会提高,如果我把它放在切换按钮中。如果我不把它放在切换按钮中,它可以工作。

WPF RoutedEventHandler 不适用于内容

引发Oma事件,因为父ToggleButton在其ButtonBase.OnMouseLeftButtonDown方法中窃取鼠标捕获,该方法在OnMouseDown方法之后调用。 只要ToggleButton具有鼠标捕获,任何其他元素都不会接收鼠标事件,因此您的标签将不会收到MouseUp事件,并且不会调用您的 OnMouseUp 方法。

OnMouseDown方法中设置e.Handled = true;以防止事件冒泡到ToggleButton。 这将防止它窃取焦点,尽管当单击其中的MyLabel时,它也会阻止按钮正常工作。 目前还不清楚在这种情况下你想要什么行为。

听起来您的自定义Oma事件的路由策略可能与您尝试执行的操作不匹配。

如果Oma事件是设置为 Direct 的 RoutedEvent ,并且 MyLabel 类的类型为 UIElement 那么您应该能够执行以下操作:

GameArea.Children.Add(box);//GameArea is UniformGrid
GameArea.AddHandler(Oma, new RoutedEventHandler(myLabel_Click));