我正在研究WPF MVVM应用程序。它有一个继承自Canvas的自定义canvas类。有一个窗口,其中一个自定义画布放置(使用XAML),它的背景颜色设置为Transaparent。使用DrawingVisuals将图形绘制到Canvas以绘制基本形状,并将它们作为Visual子项添加到Visual树中。这样可以将我的形状渲染到屏幕上。
我在后面的Window代码中向Canvas添加了一个鼠标向上事件。当我单击画布上的任何位置时,除非在绘制的视觉线上或填充形状的彩色区域上,否则会触发此操作。要明确:
来自http://msdn.microsoft.com/en-us/library/ms742254.aspx#providing_hit_testing_support 虽然我使用Canvas MouseUp事件,因为它没有MouseLeftButtonUp事件,但看起来这应该可行。在MS示例中,他们不使用Canvas但是谈论“主机容器”,但我不确定这是否相关。
如何在点击DrawingVisual时触发事件?为什么在点击绘制区域内而不在其外部时,事件会被压抑?
由于
答案 0 :(得分:1)
我已经解决了这个问题。画布具有ViewModel设置的RootNode依赖项属性。问题是当您向画布添加任何子项时,您需要调用AddVisualChild(child)和AddLogicalChild(child)。我必须将一个属性更改的回调添加到依赖项属性中,这样它就可以调用这两个方法将它们添加为视觉和逻辑子项,否则它不会理解会破坏用户输入的父子关系。
感谢大家的时间。对不起,如果我从未提供足够的细节这是一个很大的应用程序,所以试图只包含相关信息。
答案 1 :(得分:0)
我怀疑这可能是因为Canvas
正在为您进行热门测试,因此鼠标点击会被路由到儿童视觉效果。
您可以尝试从FrameworkElement
派生。你需要一些Canvas的行为吗?
答案 2 :(得分:0)
您应该阅读有关路由事件的这篇文章 http://msdn.microsoft.com/en-us/library/ms742806.aspx 如何路由事件将穿过矩形以到达主画布:)
答案 3 :(得分:0)
您是否尝试过在您的父Canvas上订阅PreviewMouseUp事件以及MouseLeftButtonUp?上面应该可以工作,但是可视化树中的某些东西很可能将事件标记为Handled,因此它不会传播。
处理预览确保您首先获得事件(预览隧道向下,然后事件冒泡,但如果处理任何预览事件,则不会冒泡更多事件。)
这里有一个详细的概述:http://msdn.microsoft.com/en-us/library/ms747183.aspx
此外,如果失败,你总是可以在事件上尝试一个类处理程序(基本上是对上述行为的覆盖):http://msdn.microsoft.com/en-us/library/ms747183.aspx#AddingInstanceHandlersthatAreRaisedEvenWhenEventsareMarkedHandled