Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net DrawingVisualMouse-Up事件_.net_Wpf_Mvvm_Mouseevent - Fatal编程技术网

.net DrawingVisualMouse-Up事件

.net DrawingVisualMouse-Up事件,.net,wpf,mvvm,mouseevent,.net,Wpf,Mvvm,Mouseevent,我正在开发一个WPF MVVM应用程序。它有一个从canvas继承的自定义canvas类。有一个窗口,其中一个自定义画布被放置(使用XAML),其背景颜色设置为“父”。使用DrawingVisuals将图形绘制到画布,以绘制基本图形,并将其作为视觉子图形添加到视觉树中。这样可以将我的形状渲染到屏幕上 我已经在窗口代码隐藏的画布中添加了鼠标向上移动事件。当我单击画布上的任何位置时,会触发此操作,但绘制的视觉线条或填充形状的彩色区域除外。要明确的是: 如果我在绘制的形状外部,即在图形的背景上单击

我正在开发一个WPF MVVM应用程序。它有一个从canvas继承的自定义canvas类。有一个窗口,其中一个自定义画布被放置(使用XAML),其背景颜色设置为“父”。使用DrawingVisuals将图形绘制到画布,以绘制基本图形,并将其作为视觉子图形添加到视觉树中。这样可以将我的形状渲染到屏幕上

我已经在窗口代码隐藏的画布中添加了鼠标向上移动事件。当我单击画布上的任何位置时,会触发此操作,但绘制的视觉线条或填充形状的彩色区域除外。要明确的是:

  • 如果我在绘制的形状外部,即在图形的背景上单击 它会开火
  • 如果有一个未填充的矩形,我点击里面的空白 区域,然后鼠标向上启动
  • 如果我单击矩形的边框线,它不会
  • 如果我在填充矩形内单击,则不会
从 虽然我使用的是Canvas MouseUp事件,但它似乎应该可以工作,因为它没有MouseLeftButtonUp事件。在MS示例中,他们不使用画布,而是谈论“主机容器”,但我不确定这是否相关

单击DrawingVisual时如何激发事件?为什么在绘图区域内而不是在绘图区域外单击时会显示事件


谢谢

我怀疑这可能是因为
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
,因此具有这两者的所有功能(以及它自己的一些功能)。