c# - RoutedEvent(MouseUp)冒泡不适用于Canvas的儿童(形状)
问题描述
我正在使用 WPF 制作一个简单的类似绘画的应用程序。我有一个上面有形状的画布。我想实现选择功能。我单击并拖动必须在 Canvas MouseUp 事件上消失的矩形区域。但是,如果光标位于矩形(或其中一个形状)上,则 Canvas 的 MouseUp 事件由于某种原因不会触发。
我读了这篇描述路由事件如何工作的文章。MouseUp 是路由事件,RoutedStrategy 等于 Bubble。正如我所读到的,这意味着如果 Canvas 的子级没有自己处理事件(e.Handled 未设置为true
),他们将触发 Canvas MouseUp 事件处理程序。
我在互联网上阅读了大量的所有内容,但没有找到任何解决方案\解释我的问题。Canvas MouseUp 只是不会触发。
背景设置好了。IsHitTestVisible 是真的。我试过了canvas.AddHandler(Shape.MouseUpEvent, new MouseButtonEventHandler(OnCanvasMouseUp), true);
。我尝试使用 PreviewMouseUp 以及特定 MouseButton 的所有处理程序。有两种解决方法:
- 将形状的 IsHistTestVisible 设置为 false。但我需要他们拥有 IsHitTestVisible == true。
- 在 Canvas MouseMove 事件中检测 MouseButton 释放。
有没有办法让一切都按它应该的那样工作(根据关于 RoutedEvents 的 MS 文章)?为什么它没有按预期工作?有没有办法以编程方式将事件冒泡给父母?
帆布:
<Canvas x:Name="MainCanvas" Grid.Column="1" Background="White"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ClipToBounds="True" IsHitTestVisible="True" >
</Canvas>
添加一些事件处理程序:
canvas.MouseUp += OnCanvasMouseUp;
canvas.PreviewMouseUp += OnCanvasMouseUp;
canvas.AddHandler(Shape.MouseUpEvent, new MouseButtonEventHandler(OnCanvasMouseUp), true);
canvas.AddHandler(Shape.MouseLeftButtonUpEvent, new MouseButtonEventHandler(OnCanvasMouseUp), true);
canvas.AddHandler(Shape.PreviewMouseUpEvent, new MouseButtonEventHandler(OnCanvasMouseUp), false);
canvas.MouseLeftButtonUp += OnCanvasMouseUp;
形状像这样添加到画布中:
Canvas.Children.Add(figure);
编辑
这是一个例子。当我在圆圈内或在它的边框上释放鼠标按钮时,Canvas.MouseUp 不会升起。
编辑2
在Canvas.Children.Add(shape)
形状仍然有 Parent 等于 null.. 并且没有办法设置它的父级之后。
编辑 3
MouseDown 正确地冒泡。
解决方案
推荐阅读
- cakephp - cakephp 2.4.6 和数组输出
- html - 错误:初始化后无法更改选择的“多重”模式
- sql-server - Where Caluse 中 SQL 中的 TOP 子句
- ios - UISearchBar 似乎返回正确的计数,但不是正确的行
- angular - 用户单击“添加记录”按钮时如何添加记录
- javascript - 类型错误:使用 ftp-deploy 时无法读取未定义的属性“减少”
- java - PDFBox PDFMergerUtility 在 JavaFX 应用程序上不稳定
- sql - SQL:使用连接选择右表中的记录计数
- c# - 使用 OWIN 托管 Swagger UI 3.0 Dist 文件夹
- firebase - Firebase 网址格式