2011-02-14 13 views
1

まだ急なWPF Mountainを登って、苦しんでいます。UserControlからMouseButtonEventを発生させると、MainWindowはMouseButtonEventArgsにアクセスできません

私は、ユーザーコントロールを定義している、と私のメインウィンドウは、(例えばマウスe.GetPositionなど)、ユーザーコントロール内のコントロールから来るMouseButtonEventArgsを取得する必要がある

の背後にあるユーザーコントロールのコードでは、私は登録を行っています私はバブリングのイベントを起こします。

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)); 
    } 

は今私のメインウィンドウで私はこのようなユーザーコントロールを宣言:

<local:MyUserControl MouseDown="MyUserControl_MouseDown"/> 

そして

private void MyUserControl_MouseDown(object sender, RoutedEventArgs e) 

の背後に、このコードをそして私は、ユーザーコントロールからのイベントを受信しますが、argsがRoutedEventArgsです(これは正常ですが)私はマウスe.GetPositionを取得する必要があるMouseButtonEventArgsへのアクセス権を持っていません。

この場合、どのような優雅なソリューションをお勧めしますか?

答えて

0

私は私が最終的になったと思いますそれは(少なくとも私が願って):

私はコードの後ろに書く:

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

は、次に、消費者(メインウィンドウ)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に表示されなければなりません)。あなたの助けのために再び

おかげで、

+0

solutioを見つけた –

+0

はい、それは私が意味したことですが、経路指定されたイベントを使うよりもはるかに簡単です。 –

1

なぜUserControlにはまだ正常なMouseDownイベントがありますが、独自のMouseDownイベントを定義しますか?

とにかく、RoutedEventHandlerを使用するようにイベントを定義した場合、RoutedEventHandlerで立ち往生することはほとんどありません。あなたはこのようにそれを宣言した:それはtypeof(RoutedEventHandler)言うビット

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

お知らせ?カスタムイベントに既存のMouseDownイベントを伝播する方法の

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); } 
    } 

例:

私はあなたのコードを間違っていないです場合は、代わりに次のようになります

InitializeComponent(); 
this.MouseDown += (s, e) => { 
    RaiseEvent(new MouseButtonEventArgs(e.MouseDevice, e.Timestamp, e.ChangedButton) 
        { 
         RoutedEvent = MyButtonDownEvent 
        }); 
}; 
+0

こんにちはHBは、あなたの助けをありがとう、あなたの努力 –

+0

こんにちはHBいただきありがとうございます。あなたのコメントに返信するには "なぜ、UserControlが既に通常のMouseDownイベントを持っている間に、あなた自身のMouseDownイベントを定義しますか?"私はUserControlから来るイベントを購読するためにMainWindowでXAMLだけを使用してそれを行う方法を見つけませんでした。また、コードをテストして、XAMLが型が不一致であると判断したことに気付きました。何か案が ? –

+0

いいえ、私はしばらくそれを修正しようとしましたが、それを解決しませんでした。あなたがRoutedEventとして登録してもかまわないのであれば、何の問題もないはずです(イベントのセッターとゲッターを取り除く必要があります) –

関連する問題