При вызове MouseButtonEvent из UserControl MainWindow не имеет доступа к MouseButtonEventArgs - PullRequest
1 голос
/ 14 февраля 2011

Все еще карабкаюсь по крутой горе WPF и испытываю страдания.

Я определил UserControl, и моему MainWindow необходимо извлечь MouseButtonEventArgs, поступающие из элемента управления внутри UserControl (например, мыши e.GetPosition)

В коде UserControl я выполнил «Регистрации» и инициировал всплывающее событие.

public static readonly RoutedEvent MyButtonDownEvent = EventManager.RegisterRoutedEvent("MyMouseButtonDown", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyUserControl));
    public event RoutedEventHandler MyButtonDown {
        add { AddHandler(MyButtonDownEvent, value); }
        remove { RemoveHandler(MyButtonDownEvent, value); }
    }
    private void MyMouseButtonDownHandler(object sender, MouseButtonEventArgs e) {
        RaiseEvent(new RoutedEventArgs(MyButtonDownEvent ));
    }

Теперь в своем главном окне я объявляю UserControl следующим образом:

<local:MyUserControl MouseDown="MyUserControl_MouseDown"/>

И этот код позади

private void MyUserControl_MouseDown(object sender, RoutedEventArgs e) 

И я получаю события от UserControl, но Args являются RoutedEventArgs (что нормально), но у меня нет доступа к MouseButtonEventArgs, которые мне нужны, чтобы получитьmouse e.GetPosition.

Какое изящное решение вы бы предложили в этом случае?

Ответы [ 2 ]

1 голос
/ 14 февраля 2011

Почему вы определяете свое собственное событие MouseDown, в то время как UserControl уже имеет нормальное событие MouseDown?

В любом случае, если вы определяете событие для использования RoutedEventHandler, то неудивительно, что вы 'в конечном итоге застрял с RoutedEventHandler.Вы объявили это так:

public static readonly RoutedEvent MyButtonDownEvent = EventManager.RegisterRoutedEvent("MyMouseButtonDown", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyUserControl));

Обратите внимание на бит, где написано typeof(RoutedEventHandler)?

Если я не ошибаюсь, ваш код должен выглядеть следующим образом:

    public static readonly RoutedEvent MyButtonDownEvent =
        EventManager.RegisterRoutedEvent
        ("MyButtonDown",
        RoutingStrategy.Bubble,
        typeof(MouseButtonEventHandler),
        typeof(MyUserControl));

    public event MouseButtonEventHandler MyButtonDown
    {
        add { AddHandler(MyButtonDownEvent, value); }
        remove { RemoveHandler(MyButtonDownEvent, value); }
    }

Пример того, как распространить существующее событие MouseDown на пользовательское событие:

InitializeComponent();
this.MouseDown += (s, e) => {
    RaiseEvent(new MouseButtonEventArgs(e.MouseDevice, e.Timestamp, e.ChangedButton)
                    { 
                        RoutedEvent = MyButtonDownEvent
                    });
};
0 голосов
/ 15 февраля 2011

Я думаю, что наконец получил (по крайней мере, надеюсь):

Если я напишу в коде:

        public event EventHandler<MouseButtonEventArgs> MyRightButtonDownHandler;
    public void MyRightButtonDown(object sender, MouseButtonEventArgs e) {
        MyRightButtonDownHandler(sender, e);
    }

Затем в потребительском (MainWindow) XAML:

<local:GlobalDb x:Name="globalDb"  MyRightButtonDownHandler="globalDb_MyRightButtonDownHandler"/>

А в коде потребителя:

    private void globalDb_MyRightButtonDownHandler(object sender, MouseButtonEventArgs e) {
        Console.WriteLine("x= " + e.GetPosition(null).X + " y= " + e.GetPosition(null).Y);
    }

Скажите, пожалуйста, если у вас есть лучшее решение (По правилам разработки - правила, установленные там, где я работаю - вся обработка событий моего приложения)ДОЛЖЕН появиться в XAML).

Еще раз спасибо за вашу помощь,

...