代码之家  ›  专栏  ›  技术社区  ›  grapkulec

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

  •  0
  • grapkulec  · 技术社区  · 17 年前

    语境:

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

    public partial class Window1 : Window
    {
        DrawingTool drawTool = new DrawingTool();
        public Window1()
        {
            InitializeComponent();            
        }
    
        private void drawingCanvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            drawTool.OnMouseLeftButtonDown(e);
        }
    }
    

    很好,但我想要更多…

    问题:

    是否可以直接处理DrawingTools类中Canvas引发的事件,而无需定义Canvas事件处理程序。我想保持我的window1代码干净,专注于窗口的东西,并将事件处理完全转移到我的类中。

    我考虑过从frameworkelement派生drawingtool,重写onrender并在画布上透明地绘制它,这样用户的单击似乎是在画布上进行的,但实际上会在drawingtool中提升并在内部处理。此方法适用于绘图功能(绘图完成后,将绘制对象添加到画布子级,并从绘图工具子级中删除),但当涉及选择模式或其他模式时,例如,元素的命中测试存在问题。

    因此,我将感谢任何关于如何解决我的问题或解释为什么这是一个愚蠢的想法的建议:)

    2 回复  |  直到 14 年前
        1
  •  1
  •   Strelok    17 年前

    只需将私有控制字段公开为公共属性,当您拥有Window1的实例时,可以这样做

    Window1.DrawingCanvas.MouseLeftButtonDown += YourHandlerMethod;
    
        2
  •  0
  •   Thorsten Dittmar    17 年前

    我不确定你的问题是否正确,我只玩过一点WPF,但是如何创建一个包含你的画布的用户控件,处理鼠标并在那里绘图?这个可以命名 DrawingControl 诸如此类。

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