C# WPF-如何在引发该事件的组件外部处理鼠标事件?

C# WPF-如何在引发该事件的组件外部处理鼠标事件?,c#,wpf,event-handling,mouseevent,C#,Wpf,Event Handling,Mouseevent,背景: 有一个应用程序,你可以在画布上画东西。例如,用户单击的地方有一个黑点。但在主窗口代码中的事件处理程序中处理画布引发的事件对我来说太难看了。因此,我编写了一个类,其中的方法镜像画布鼠标事件,并在事件处理程序中调用这些方法 public partial class Window1 : Window { DrawingTool drawTool = new DrawingTool(); public Window1() { InitializeCompo

背景:

有一个应用程序,你可以在画布上画东西。例如,用户单击的地方有一个黑点。但在主窗口代码中的事件处理程序中处理画布引发的事件对我来说太难看了。因此,我编写了一个类,其中的方法镜像画布鼠标事件,并在事件处理程序中调用这些方法

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引发的事件,而无需定义canvas事件处理程序。我希望保持我的Window1代码干净,专注于窗口内容,并将事件处理完全转移到我的类中

我考虑从FrameworkElement派生DrawingTool,覆盖OnRender并在画布上透明地绘制它,这样用户的点击看起来是在画布上进行的,但实际上会在DrawingTool中引发并在内部处理。这种方法适用于绘图功能(绘图完成后,绘图对象被添加到画布子对象,并从DrawingTool子对象中删除),但当涉及到选择模式或其他模式时,例如元素的命中测试会出现问题


因此,如果您能为我提供解决问题的建议或解释为什么这是一个愚蠢的想法,我将不胜感激:)

只要将私有控件字段公开为公共属性,当您有一个Window1实例时,您就可以这样做

Window1.DrawingCanvas.MouseLeftButtonDown += YourHandlerMethod;

我不确定是否正确处理了您的问题,我只玩了一点WPF,但是创建一个包含画布的用户控件并在其中处理鼠标和绘图如何?这可以命名为
DrawingControl
或类似名称


这样,就可以在表示控件的类中包含绘图代码。您可能希望为新用户控件提供一个允许访问“内部”画布的属性。

这是一个非常简单的解决方案,我没有考虑过。我正在寻找一个事件设定者或者一些聪明的代表伏都教,但像往常一样,奥卡姆的剃须刀派上了用场:)Thx。如果我想制作自己的绘图控件,这是一种方式,但我没有:)