.net DrawingVisualMouse-Up事件
我正在开发一个WPF MVVM应用程序。它有一个从canvas继承的自定义canvas类。有一个窗口,其中一个自定义画布被放置(使用XAML),其背景颜色设置为“父”。使用DrawingVisuals将图形绘制到画布,以绘制基本图形,并将其作为视觉子图形添加到视觉树中。这样可以将我的形状渲染到屏幕上 我已经在窗口代码隐藏的画布中添加了鼠标向上移动事件。当我单击画布上的任何位置时,会触发此操作,但绘制的视觉线条或填充形状的彩色区域除外。要明确的是:.net DrawingVisualMouse-Up事件,.net,wpf,mvvm,mouseevent,.net,Wpf,Mvvm,Mouseevent,我正在开发一个WPF MVVM应用程序。它有一个从canvas继承的自定义canvas类。有一个窗口,其中一个自定义画布被放置(使用XAML),其背景颜色设置为“父”。使用DrawingVisuals将图形绘制到画布,以绘制基本图形,并将其作为视觉子图形添加到视觉树中。这样可以将我的形状渲染到屏幕上 我已经在窗口代码隐藏的画布中添加了鼠标向上移动事件。当我单击画布上的任何位置时,会触发此操作,但绘制的视觉线条或填充形状的彩色区域除外。要明确的是: 如果我在绘制的形状外部,即在图形的背景上单击
- 如果我在绘制的形状外部,即在图形的背景上单击 它会开火
- 如果有一个未填充的矩形,我点击里面的空白 区域,然后鼠标向上启动
- 如果我单击矩形的边框线,它不会
- 如果我在填充矩形内单击,则不会
谢谢我怀疑这可能是因为
Canvas
正在为您进行点击测试,因此鼠标点击会传递到孩子的视觉效果
您可以尝试从
框架元素
派生吗。您需要画布的某些行为吗?您应该阅读这篇关于路由事件的文章
路由事件将如何穿过矩形到达主画布:)您是否尝试订阅PreviewMouseUp事件以及父画布上的MouseLeftButtonUp?上面的方法应该有效,但是可视化树中的某些东西可能会将事件标记为已处理,因此它不会传播 处理预览确保您首先获取事件(预览向下,然后事件冒泡,但如果处理了任何预览事件,则不会再冒泡其他事件) 这里有一个详细的概述:
此外,如果失败,您可以尝试在事件上使用类处理程序(基本上是对上述行为的重写):我已经解决了问题。画布具有ViewModel设置的RootNode依赖项属性。问题是,当您向画布添加任何子对象时,需要调用AddVisualChild(子对象)和AddLogicalChild(子对象)。我不得不向dependency属性添加一个属性更改回调,这样它就可以调用这两个方法,将它们添加为可视和逻辑子级,否则它就无法理解父子关系,从而导致用户输入出错
谢谢大家抽出时间。对不起,如果我没有提供足够的细节。这是一个大应用程序,所以我们尝试只包含相关信息。谢谢。我尝试了PreviewmouseUp,但它在与MouseUp相同的情况下启动。我尝试为已处理事件添加处理程序,但它只在与正常事件相同的情况下启动,我猜这表明soemthing没有将事件标记为已处理。@AlanMacdonald嗯,好吧,疯狂的东西。好的,这里有一个解决方法。在顶部直接创建另一个具有相同宽度/高度的画布,并将背景设置为透明。然后订阅该事件的鼠标事件。是的,我知道,很可怕,但它应该有用。如果没有,它会告诉您DrawingVisual根本没有窃取鼠标事件,但应用程序中的其他东西是…@AlanMacdonald您不也需要在画布中放置一些东西来承载DrawingVisual吗?Ie:视觉采集。也许这是在窃取事件。我想说的是,视觉树中的某个东西在你的画布上,正在进行活动。您是否尝试过使用WPF Snoop检查可视化树以查看其生成的内容?我认为这不适用于DrawingVisual,因为它们不从UIElement或ContentElement继承,因此无法处理路由事件。至少我是这么想的。将我的自定义类改为从FrameworkElement继承似乎完全阻止了事件的触发。是的,我也尝试了一下,没有事件触发。这就像你的画布没有指定背景颜色一样。但是框架元素没有背景颜色,所以我必须删除设置该属性的XAML。但是颜色可能是无关的。FrameworkElement不用于侦听事件!它扮演着版面参与的角色,如果你有兴趣倾听事件,你需要扩展UIElement@simo
FrameworkElement
是一个UIElement
,具有所有相同的功能(加上一些自己的功能)。而Canvas
是一个FrameworkElement
,因此具有这两者的所有功能(以及它自己的一些功能)。