2011-12-22 23 views
2

私は、動作するWinformイベントを必要とする複雑なシステムを持っています。しかし、私はそれにWPF要素を追加したい。だから私はすべてのWPFイベントをwinformの対応物にマッピングする必要があります。例えば。私は派生したElementHostクラスのMouseMoveイベントを変換するこのメソッドを持っています。WPFイベントをWindowsフォームイベントにマッピングする

private void Child_MouseMove(object sender, System.Windows.Input.MouseEventArgs e) 
    { 
     Point point = e.GetPosition(null); 
     System.Windows.Forms.MouseEventArgs eventArgs = 
      new System.Windows.Forms.MouseEventArgs 
       (System.Windows.Forms.MouseButtons.Left, 0, (int)point.X, (int)point.Y, 0); 
     OnMouseMove(eventArgs); 
    } 

注System.Windows.Input.MouseEventArgs(WPF)およびSystem.Windows.Forms.MouseEventArgs(Winformsの)との差。

問題は、この方法でマップする必要があるイベントが多すぎるということです。イベントごとに独自のマッピング方法を記述しなければ、これが達成できる可能性はありますか?

+1

達成したいことはありますか? – Tigran

+1

なぜそれらをすべてマップする必要がありますか? – Adam

+0

ElementHostはOnMouseMoveを実装していますが、そこに実装されていないものは何ですか? – MBirchmeier

答えて

1

いいえ、WPFとフォームが異なる引数とイベントを持ち、異なる状況下でそれらを起動するので、自動的に実行する方法はありません。あなたは2つの異種のものと結婚しようとしています、そして、私は悪夢への道にいると思います。

達成しようとしていることは何ですか?私は何らかのGUI抽象化を想定していますか?あなたの抽象化はおそらくコードの下に移動し、GUIが望むように動作するようになるでしょう。

編集:OK、フォーム環境で操作できるように、WPFコントロール上にファサードを実装しています。手動で行う以外の方法はありません。あなたは本当にWPFコントロールを使用する必要がありますか?

+0

あなたの答えをありがとう。はい、WPFコントロールでなければなりません。 – RolandK

+1

おそらくここにいくつかの情報があります:http://msdn.microsoft.com/en-us/library/ms751797.aspx – Adam

1

残念ながら私はGazに同意するのは簡単な方法ではありません。

移行を簡単にするために推奨できるのは、ToWinformsEventなど、すべてを行う共通の拡張メソッドを作成することだけです。これの利点は、多くのコントロールで同じ子パラメータが使用されることです。標準の拡張メソッドを実装することで、多少の意味のあるパラメータを変換することができます(たとえば、MouseEventArgsへのポイントの変換は、あなたの機能)

+0

あなたの考えをありがとう。 – RolandK

1

これは他のポスターと一致しますが、これは手動でのみ行うことができます。しかし、一度しか実装しないように、コードをきれいにまとめることは可能です。

最近のプロジェクトでこれを処理するために、MouseManagerというヘルパークラスを作成しました。私はIPublisWinFormsEventsを実装しIPublishWpfEventsを実装し、WinformsのUserControlsのでしょうWPFユーザーコントロールのために

void Subscribe(IPublisWpfEvents publisher, ISinkMouseEvents target); 
void Subscribe(IPublishWinformsEvents publisher, ISinkMouseEvents target) 
void Unsubscribe(IPublisWpfEvents publisher); 
void Unsubscribe(IPublishWinformsEvents publisher); 

:MouseManagerは、このようなメソッドを持っていました。 2つのインターフェイスは組み込みマウスイベントの正確なシグネチャを持つため、実際には何の変更も必要なく、ユーザーコントロールにインターフェイスを貼り付けるだけです。

最後に、MouseManagerは(2つの異なるタイプの)パブリッシャーと1つのタイプのサブスクライバーとの間のイベントをワイヤーアップします。 MouseButtonとMousePointクラスのように自分で定義した列挙型を持つ独自の統合MouseArgsを作成する必要がありました。

私は今、すべてのマウスイベントを処理するためのインターフェイスを持っています。これは、単体テストのパブリケーションとRhinoMockなどのイベントのシンクを意味します。

これは役に立ちます。

+0

ご意見ありがとうございます。たぶん私はそれを行くだろう。 – RolandK

関連する問題