c# - WPF RoutedEventHandler 不适用于内容

标签 c# wpf routedevent

我对 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/

相关文章:

wpf - F# 中的自定义路由事件

c# - 在 C# 中,如何在不移动光标的情况下将字符输出到控制台?

c# - 如何将参数传递给 EventHandler

C# 我需要 TRY/CATCH 才能抛出吗?

c# - 将详细信息从一个窗口传递到另一个窗口

wpf - 我如何接收对 WPF (MVVM) 中控件的引用?

c# - WPF KeyBinding 吞咽键,防止 TextBox 使用

wpf - 您可以将路由事件与 MultiTrigger 一起使用吗?

c# - 是否可以将两个源属性绑定(bind)到一个控件属性?