我在使用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));
        }

    }


如果我将其放在ToggleButton中,则OmaEvent永远不会提高。如果我不将其放在ToggleButton中,它将起作用。

最佳答案

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

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

关于c# - WPF RoutedEventHandler不适用于内容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27389469/

10-10 23:27