1

急なWPFの山を登り続け、苦しんでいます。

UserControl を定義しました。MainWindow は、UserControl 内のコントロールからの MouseButtonEventArgs を取得する必要があります (たとえば、マウスの 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 ));
    }

MainWindow で、次のように UserControl を宣言します。

<local:MyUserControl MouseDown="MyUserControl_MouseDown"/>

そして、このコードビハインド

private void MyUserControl_MouseDown(object sender, RoutedEventArgs e) 

UserControl からイベントを受け取りますが、Args は RoutedEventArgs (これは正常です) ですが、マウス e.GetPosition を取得する必要がある MouseButtonEventArgs にアクセスできません。

この場合、どのようなエレガントなソリューションを提案しますか?

4

2 に答える 2

0

私はついにそれを手に入れたと思います(少なくとも私は願っています):

コードビハインドに書くと:

        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 に表示される必要があります)。

ご協力ありがとうございました。

于 2011-02-15T18:39:04.657 に答える