2009-02-24 52 views
3

我对添加到WPF画布的元素上的MouseLeftButtonDown事件做出响应。单击时它可以正常工作(即事件处理程序正确触发),但它需要鼠标指针的精确度。你必须在圆圈的顶部才能完成工作。我需要它更宽容一点;也许至少有1或2个像素宽容。画布上的元素是漂亮的大圆圈(大约是屏幕四分之一的大小),所以圆圈本身不是太小,但每个的StrokeWidth都是1,所以它是细线。在画布上的MouseLeftButtonDown需要太多精度

您可以在这里看到的截图:http://twitpic.com/1f2ci/full

大多数图形应用程序都没有这个挑剔鼠标采摘,所以我想给用户提供熟悉的体验。

我该如何让它更宽容一点。

回答

4

您可以连接到您的根布局对象的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

该点参数,您可以使用MouseEventArgs参数e,并像这样调用其GetPosition方法:

Point p = e.GetPosition(null) 

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

您可以创建从鼠标的位置,以创建一个假耐性的效果4个对象,并呼吁所有4个点或者FindElementsInHostCoordinates或的HitTest。

+0

嗯,你让我走了。注意:FindElementsInHostCoordinates si仅适用于silverlight,所以我不得不使用HitTest。我也做了你的4点事情。在我的答案文章下面查看。谢谢。 – MattSlay 2009-02-24 16:34:43

+0

我正在使用现在着名的“4点事物”结合HitTest功能,它对我来说工作正常!谢谢! – SuperOli 2009-11-26 15:37:56

4

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

如果失败了,你也可以画上相同的位置其他各界帮手圈。使圆前景颜色透明,并使画笔的厚度增加几个像素,以获得更可接受的可点击区域的圆。

希望这有助于!

1

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

首先,我搬到移动事件处理到画布上,而不是每个椭圆。从OOP的角度来看,这是好事和坏事。至少当鼠标事件处理由HolePattern负责将其设置到每个Hole(椭圆是Hole的视觉)时,它将被抽象出来,以便我的HolePattern的任何使用者都能自动获得这种功能。但是,通过将其移动到主UI代码,我现在正在处理更高级别的画布鼠标事件。但是,这并非全部不好。我们可以讨论这个部分好几天。

问题是,我设计了一种方法来在用鼠标在画布上选择某个东西时创建一个“误差范围”,然后读取所选椭圆所属的孔,然后我可以读取HolePattern Hole属于,并且我的整个UI(ListView,textboxes,gridview和fo坐标)全部由现有的XAML绑定更新,并且Canvas通过对现有方法的一次调用来更新以重新生成画布。老实说,我无法相信自己已经弄明白了这些(当然也有你的帮助和其他人的帮助)。有这样一个愿景并且看到它的存在,这是一种非常酷的感觉。

这里看看主要的代码:

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; 

      } 
     } 
    } 
} 
1

只是增加了椭圆形的笔画粗细,使其可调

因此MouseLeftButtonDown事件工作 例: 在椭圆标签:

Ellipse Canvas.Left =“10”Canvas.Top =“133”Height =“24”Name =“ellipse1”Width =“23”Stroke =“Red”Mo useLeftButtonDown = “ellipse1_MouseLeftButtonDown” 工具提示= “关闭温度” StrokeEndLineCap = “平的” StrokeThickness = “12”

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