0

コンテクスト:

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

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

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

いいですが、もっと欲しいです...

質問:

キャンバスイベントハンドラーを定義しなくても、DrawingToolクラスでcanvasによって発生したイベントを直接処理することはできますか?Window1コードをクリーンに保ち、ウィンドウ関連に焦点を合わせ、イベント処理を完全にクラスに移動したいと思います。

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

だから、私の問題を解決する方法の提案や、これがまったく愚かな考えである理由の説明に感謝します:)

4

2 に答える 2

1

プライベート コントロール フィールドをパブリック プロパティとして公開するだけで、Window1 のインスタンスがある場合に実行できます。

Window1.DrawingCanvas.MouseLeftButtonDown += YourHandlerMethod;
于 2009-07-03T06:23:02.937 に答える
0

問題が解決したかどうかはわかりませんが、WPF で少し遊んだだけですが、キャンバスを含むユーザー コントロールを作成し、マウスを操作してそこに描画するのはどうですか? DrawingControlこれには、名前などを付けることができます。

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

于 2009-07-03T06:48:37.653 に答える