WPF RoutedEventHandler не работает с контентом

У меня проблема с 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.
OmaEvent в MyLabel выглядит так:

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, это работает.

2 ответа

Решение

Oma событие не вызывается, потому что родитель ToggleButton крадет захват мыши в его ButtonBase.OnMouseLeftButtonDown метод, который вызывается после вашего OnMouseDown метод. Никакой другой элемент не будет получать события мыши, пока ToggleButton имеет захват мыши, поэтому ваш ярлык не получит MouseUp событие, и ваш OnMouseUp метод не будет вызван.

Задавать e.Handled = true; в вашем OnMouseDown метод, чтобы предотвратить пузыри событие до ToggleButton, Это предотвратит кражу фокуса, хотя и не даст кнопке нормально работать, когда MyLabel внутри нажимается. Непонятно, какое поведение вы хотите в этом сценарии.

Это звучит как ваша RoutingStrategy для вашего обычая Oma событие может не соответствовать тому, что вы пытаетесь сделать.

Если Oma событие RoutedEvent установлено в Directи MyLabel класс имеет тип UIElement тогда вы должны быть в состоянии сделать что-то вроде следующего:

GameArea.Children.Add(box);//GameArea is UniformGrid
GameArea.AddHandler(Oma, new RoutedEventHandler(myLabel_Click));
Другие вопросы по тегам