我响应的MouseLeftButtonDown上加入到WPF画布元素事件。当点击这一切工作正常(即事件处理程序触发关闭正确),但它需要将鼠标指针太多的精度。你必须要完美的圆圈的顶部,使其工作。我需要的是多一点宽容;也许至少1或2 pixles宽容。在画布上的元素是不错的大圈(大约四分之一的屏幕上的尺寸),因此圆本身不是太小,而是每一个的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 /库/ cc838402(VS.95)的.aspx

有关的参数点,则可以使用MouseEventArgs参数e,并调用其为getPosition方法是这样的:

Point p = e.GetPosition(null)

我不记得是否使用的HitTest代替FindElementsInHostCoordinates的。尝试两种。结果 http://msdn.microsoft.com/en-us/library/ms608752。 ASPX

您可以创建从鼠标位置4个对象来创建假耐性的效果,并调用任一FindElementsInHostCoordinates或的HitTest对于所有4个点。

其他提示

您可能想尝试,以填补圈与透明色,使整个圆圈点击...

如果失败了,你也可以画上相同的位置其他各界帮手圈。使圆前景色透明,并且使刷几个像素更宽周围的圆更可接受的可点击区域..

的厚度

希望这有助于!

我觉得我已经做到了(你帮助让我开始)...

首先,我已移动移动事件处理的帆布,而不是每一个椭圆。这是好的和坏的,从面向对象的角度来看。至少当鼠标事件处理是HolePattern的责任,把它放在了每个洞(即视觉孔的椭圆),它被抽象掉,这样我HolePattern的任何消费将automactically得到这个functioanality。但是,通过将其移动到主界面代码,我现在是在更高层次上处理我的画布的鼠标事件。但是,这并不是所有的坏的。我们可以讨论这个部分了好几天。

点是,我已经设计了一个方法来创建一个“错误的容限”挑选在画布上的东西时,用鼠标,然后读取该所选择的椭圆属于孔,然后我可以读取HolePattern那所述孔属于,和我的整个UI(ListView中,文本框,gridview的FO坐标)都是由现有XAML更新的绑定,和画布与一个呼叫更新到现有的方法来再生画布。

说实话,我不能相信我已经想通了这一切了(在您的帮助和其他人也一样,当然)。它是这样一个凉爽的感觉有那么这笔视力,看它来定。

这里检查出主代码:

void canvas1_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    int ClickMargin = 2;
    Point ClickedPoint = e.GetPosition(canvas1);
    Point p1 = new Point(ClickedPoint.X - ClickMargin, ClickedPoint.Y - ClickMargin);
    Point p2 = new Point(ClickedPoint.X - ClickMargin, ClickedPoint.Y + ClickMargin);
    Point p3 = new Point(ClickedPoint.X + ClickMargin, ClickedPoint.Y + ClickMargin);
    Point p4 = new Point(ClickedPoint.X + ClickMargin, ClickedPoint.Y - ClickMargin);
    var PointPickList = new Collection<Point>();
    PointPickList.Add(ClickedPoint);
    PointPickList.Add(p1);
    PointPickList.Add(p2);
    PointPickList.Add(p3);
    PointPickList.Add(p4);

    foreach (Point p in PointPickList)
    {
        HitTestResult SelectedCanvasItem = System.Windows.Media.VisualTreeHelper.HitTest(canvas1, p);
        if (SelectedCanvasItem.VisualHit.GetType() == typeof(Ellipse))
        {
            var SelectedEllipseTag = SelectedCanvasItem.VisualHit.GetValue(Ellipse.TagProperty);
            if (SelectedEllipseTag!=null &&  SelectedEllipseTag.GetType().BaseType == typeof(Hole))
            {
                Hole SelectedHole = (Hole)SelectedEllipseTag;
                SetActivePattern(SelectedHole.ParentPattern);
                SelectedHole.ParentPattern.CurrentHole = SelectedHole;

            }
        }
    }
}

只是增加椭圆的笔画粗细,以便它是可调节的

因此MouseLeftButtonDown事件作品 例: 在椭圆标记:

<强>椭圆  Canvas.Left = “10” Canvas.Top = “133” HEIGHT = “24” NAME = “在ellipse1的” WIDTH = “23” 行程= “红” 的MouseLeftButtonDown = “ellipse1_MouseLeftButtonDown” 工具提示= “临时关闭” StrokeEndLineCap = “平”的 StrokeThickness = “12”

私人无效ellipse1_MouseLeftButtonDown(对象发件人,MouseButtonEventArgs E)         {             应用curApp = Application.Current;             curApp.Shutdown();         }

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top