WPFは - どのようにイベントを発生させたコンポーネントの外側にマウスイベントを処理するには?
-
21-08-2019 - |
質問
コンテキスト:
あなたがキャンバスに物事を描くアプリケーションがあります。ユーザーは、例えば、黒のドットが、ありますクリックするところ。しかし、メインウィンドウのコードでイベントハンドラではキャンバスで発生したイベントが、私にとってはちょうど醜いであることを取り扱います。だから私は方法がキャンバスのマウスイベントをミラーするクラスを書いて、私は、イベントハンドラ内でこれらのメソッドを呼び出します。
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のコードを維持し、私のクラスに完全にイベント処理を移動したいと思います。
私はOnRenderをオーバーライドして、ユーザーのクリックがキャンバスに実際に行われているように見えたDrawingToolに上げて、内部的に処理されますので、キャンバスの上に透過的にそれを描く、FrameworkElementからDrawingToolを導出について考えました。このアプローチは、描画機能で動作します(描画が行われた後、描画オブジェクトが子供をキャンバスに追加され、DrawingToolの子供から削除されます)が、それは選択モードまたは他人に来るとき例えば要素のヒットテストに問題がある。
だから、私はこれは全く愚かな考えですなぜ私の問題や説明を解決するためにどのように任意の提案のために感謝するよ:)
解決
ただ、パブリックプロパティとして民間の制御フィールドを公開し、あなたはウィンドウ1のインスタンスを持っているときにだけ行うことができます。
Window1.DrawingCanvas.MouseLeftButtonDown += YourHandlerMethod;
他のヒント
私は右のあなたの問題を得たかどうかわからないんだけど、と私はWPFで少しプレイしましたが、どのようにあなたのキャンバスを含むユーザーコントロールを作成し、マウスを処理し、そこに描画についてはどうですか?これはDrawingControl
の名前などをすることができます。
あなたがコントロールを表すクラスに含まれる描画コードを持つことができるだろうその方法。あなたは、新しいユーザーコントロールに「内部」キャンバスへのアクセスを可能にする特性を与えたいと思うかもしれません。