2009-02-24 39 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(); }