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

时间:2009-07-03 06:01:43

标签: c# wpf event-handling mouseevent

上下文:

有一个应用程序,您可以在画布上绘制内容。例如,用户点击的地方有一个黑点。但是在主窗口代码中处理事件处理程序中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子项中删除)但是当涉及选择模式或其他时,元素的命中测试存在问题。例如。

所以,我会感激任何建议如何解决我的问题或解释为什么这是一个愚蠢的想法:)

2 个答案:

答案 0 :(得分:1)

只需将私有控制字段公开为公共属性,当您拥有Window1实例时,就可以执行

Window1.DrawingCanvas.MouseLeftButtonDown += YourHandlerMethod;

答案 1 :(得分:0)

我不确定我的问题是否正确,而且我只使用了WPF,但是如何创建一个包含画布并处理鼠标并在那里绘图的用户控件呢?这可以命名为DrawingControl等。

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