WPF RoutedEventHandler不适用于内容

时间:2014-12-09 21:48:06

标签: 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会阻止我的路由器呢?

编辑: 代码工作正常,但是当我把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中,它就可以了。

2 个答案:

答案 0 :(得分:0)

听起来您自定义Oma活动的RoutingStrategy可能与您尝试做的事情不符。

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

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

答案 1 :(得分:0)

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

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