我覺得我已經做到了(你幫助讓我開始)...
首先,我搬到移動事件處理到畫布上,而不是每個橢圓。從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;
}
}
}
}
嗯,你讓我走了。注意:FindElementsInHostCoordinates si僅適用於silverlight,所以我不得不使用HitTest。我也做了你的4點事情。在我的答案文章下面查看。謝謝。 – MattSlay 2009-02-24 16:34:43
我正在使用現在着名的「4點事物」結合HitTest功能,它對我來說工作正常!謝謝! – SuperOli 2009-11-26 15:37:56