我想我已经做到了(在你的帮助下让我开始)......
首先,我将移动事件处理移至 Canvas 而不是每个 Ellipse。从 OOP 的角度来看,这有好有坏。至少当鼠标事件处理是 HolePattern 的责任在每个 Hole 上设置它时(椭圆是 Hole 的视觉对象),它被抽象出来,以便我的 HolePattern 的任何消费者都将自动获得此功能。但是,通过将其移至主 UI 代码,我现在正在更高级别处理我的画布鼠标事件。但这也不全是坏事。我们可以讨论这部分几天。
关键是,我设计了一种方法,可以在用鼠标在画布上选择东西时创建“误差范围”,然后读取所选 Ellipse 所属的 Hole,然后我可以读取 Hole 所属的 HolePattern to,以及我的整个 UI(ListView、文本框、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;
}
}
}
}