我觉得我已经做到了(你帮助让我开始)...
首先,我搬到移动事件处理到画布上,而不是每个椭圆。从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