2

我对 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 中,它就可以工作。

4

2 回答 2

0

听起来您的自定义事件的RoutingStrategyOma可能与您尝试执行的操作不匹配。

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

GameArea.Children.Add(box);//GameArea is UniformGrid
GameArea.AddHandler(Oma, new RoutedEventHandler(myLabel_Click));
于 2014-12-09T22:04:46.783 回答
0

Oma事件没有被引发,因为父级ToggleButton在其方法中窃取了鼠标捕获,该方法在您的方法之后ButtonBase.OnMouseLeftButtonDown被调用。只要有鼠标捕获,其他元素就不会收到鼠标事件,因此您的标签将不会收到事件,并且您的方法也不会被调用。OnMouseDownToggleButtonMouseUpOnMouseUp

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

于 2014-12-09T22:31:46.587 回答