c# - Canvas 上的 MouseLeftButtonDown 需要太高的精度

标签 c# wpf canvas mouse precision

我在添加到 WPF Canvas 的元素上响应 MouseLeftButtonDown 事件。单击时一切正常(即事件处理程序正确触发),但它对鼠标指针的精度要求太高。你必须完美地站在圆圈的顶端才能让它发挥作用。我需要它更宽容一点;也许至少 1 或 2 个像素宽容。 Canvas 上的元素是漂亮的大圆圈(屏幕上大约四分之一的大小),所以圆圈本身并不太小,但是每个圆圈的 StrokeWidth 都是 1,所以它是一条细线。

您可以在此处查看屏幕截图:http://twitpic.com/1f2ci/full

大多数图形应用对鼠标的选择都不是那么挑剔,所以我想给用户一个熟悉的体验。

我怎样才能让它更宽容一点。

最佳答案

您可以连接到您的根布局对象的 MouseLeftButtonDown 事件,并通过执行以下操作检查哪些元素在点击范围内:

List<UIElement> hits = System.Windows.Media.VisualTreeHelper.FindElementsInHostCoordinates(Point, yourLayoutRootElement) as List<UIElement>;  

http://msdn.microsoft.com/en-us/library/cc838402(VS.95).aspx

对于Point参数,可以使用MouseEventArgs参数e,调用它的GetPosition方法是这样的:

Point p = e.GetPosition(null)

我不记得是否使用 HitTest 而不是 FindElementsInHostCoordinates。两个都试试。
http://msdn.microsoft.com/en-us/library/ms608752.aspx

您可以从鼠标位置创建 4 个 Point 对象以创建假公差效果,并为所有 4 个点调用 FindElementsInHostCoordinates 或 HitTest。

关于c# - Canvas 上的 MouseLeftButtonDown 需要太高的精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/580641/

相关文章:

javascript - 2D Canvas : specify `arc()` radius units

c# - 表达式树是线程安全的吗?

c# - 在构造函数中接收容器的Unity容器注册对象

c# - 另一种管理这种依赖的方法

c# - 使用自定义 WPF 控件时无法设置某些属性

c# - PrintNormal() 问题 'It is not Initialized'

c# - 处理 SymmetricAlgorithm 时 "try-finally" block 与 "using" block

wpf - 在 WPF 应用程序中托管网页并与之交互

canvas - 如何在 HTML5 Canvas 中剪辑 INSIDE 形状?

javascript - Fabric js 图像过滤器加载问题