DrawingVisual Mouse Up事件

时间:2012-03-27 10:44:20

标签: .net wpf mvvm mouseevent

我正在研究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时触发事件?为什么在点击绘制区域内而不在其外部时,事件会被压抑?

由于

4 个答案:

答案 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