2009-07-03 20 views
0

状況:WPF - そのイベントを発生させたコンポーネントの外でマウスイベントを処理する方法は?

キャンバスに物を描くアプリケーションがあります。たとえば、ユーザーがクリックすると、黒い点が表示されます。しかし、メインウィンドウのコードのイベントハンドラでキャンバスで発生したイベントを処理することは、私にとっては醜いです。だから、私は、キャンバスのマウスイベントをミラーリングするメソッドをクラスに書いて、それらのメソッドをイベントハンドラの中で呼び出す。

public partial class Window1 : Window 
{ 
    DrawingTool drawTool = new DrawingTool(); 
    public Window1() 
    { 
     InitializeComponent();    
    } 

    private void drawingCanvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     drawTool.OnMouseLeftButtonDown(e); 
    } 
} 

ニース、私はもっと欲しい...

質問:

それが直接定義されたキャンバスのイベントハンドラを持たずに、私のDrawingToolクラスのキャンバスで発生するイベントを処理することが可能です。私はWindow1のコードをきれいにして、ウィンドウのものに集中し、イベントをクラスに完全に移すようにしたいと思います。

FrameworkElementからDrawingToolを派生させ、OnRenderをオーバーライドしてキャンバス上に透過的に描画すると、ユーザーのクリックがキャンバス上に作成されたように見えますが、実際にはDrawingToolで発生し、内部的に処理されます。この方法は、描画機能を使用します(描画後に描画オブジェクトがキャンバスの子に追加され、DrawingToolの子から削除されます)が、選択モードなどでは要素のヒットテストに問題があります。

だから、私はなぜこれが全く愚かな考えです:)

答えて

1

ちょうどパブリックプロパティとして民間の制御フィールドを公開し、あなたがインスタンスを持っていたときに私の問題や説明を解決する方法任意の提案のために感謝しますよウィンドウ1のあなただけの

Window1.DrawingCanvas.MouseLeftButtonDown += YourHandlerMethod; 
+0

これはかなり簡単な解決策であり、私はそれについて考えなかった。私はイベントのセッターをスタイリストや巧みなデリゲートブードゥーに配置していましたが、いつものようにokhamの剃刀は便利でした:) Thx。 – grapkulec

0

私は右のあなたの問題を得たかどうかわからないんだけど、私は唯一のWPF少しでプレイしましたが、行うことができますどのようにあなたのキャンバスを含むユーザーコントロールを作成し、取り扱いについてマウスとそこに描画?これは、DrawingControlなどと命名することができる。

こうすれば、コントロールを表すクラスに含まれる描画コードを持つことができます。新しいユーザコントロールに「内部」キャンバスへのアクセスを許可するプロパティを与えることができます。

+0

それは私が自分の描画コントロールを作っていたが、私はしない場合の方法だろう:) – grapkulec

+0

ああ、OK。見る?私はあなたの問題を正しく得られなかった: - D –

関連する問題