以编程方式添加的在画布上绘制从网格到网格的线
本文关键字:网格 绘制 方式 编程 添加 | 更新日期: 2023-09-27 17:51:04
我有一个绑定到List 的Canvas
<ItemsControl x:Name="MyCanvasControl" ItemsSource="{Binding Nodes}" Grid.Column="2">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas x:Name="NodeCanvas" >
<Canvas.Style>
<Style>
<Setter Property="Panel.Background" Value="Gray"/>
</Style>
</Canvas.Style>
</Canvas>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
所以我做了多个网格,每个网格里面都有一个矩形。我将网格添加到绑定到画布的网格列表中。他们看起来很好。我用一个特殊的矩形做了一个特殊网格,然后把它放在画布的另一端。
这个特殊的网格将是我的"TargetGrid"。我希望我之前在集合中制作的每个网格都有一条从它们到我的"目标网格"的唯一线
Point p = TargetGrid.TransformToAncestor(MainWindowView.getInstance().MyCanvasControl).Transform(new Point(0, 0));
Grid g = new Grid();
g.Name = "line";
Line RC = new Line();
g.Children.Add(RC);
foreach (Grid gr in Nodes)
{
if(gr.Name != "line")
{
RC.X1 = Canvas.GetLeft(gr);
RC.Y1 = Canvas.GetTop(gr);
RC.Y2 = p.Y - RC.Y1;
RC.X2 = p.X - RC.X1;
Canvas.SetLeft(g, RC.X1);
Canvas.SetTop(g, RC.Y1);
RC.Stroke = System.Windows.Media.Brushes.Blue;
RC.StrokeThickness = 2;
Nodes.add(RC);
}
}
发生的事情很奇怪。每一行都能很好地命中TargetGrid。因此端点是正确的(Y2和X2(。不正确的是X1和Y1,因为某种原因,我不明白为什么。它们对于网格1和3是正确的,但之后的每个网格都会得到遍布各处的线。坐标看起来也很好!X1和Y1正是我所期望的。
如果我稍后得到一张照片,我会把它展示出来。
编辑:如果我完全按照我对p和TargetGrid所做的那样。。。
Point pp = gr.TransformToAncestor(MainWindowView.getInstance().MyCanvasControl).Transform(new Point(0, 0));
pp.x和pp.y总是0,0,就好像网格不在画布控件中一样。但奇怪的是,TargetGrid总是在那里,它做得很好。
编辑2:形象https://i.stack.imgur.com/iVe97.jpg
RC.X2 = p.X;
RC.Y2 = p.Y;
Canvas.SetLeft(g, Canvas.GetLeft(gr));
Canvas.SetTop(g, Canvas.GetTop(gr));
溶液是将X1和Y1留在0。它们的原点是网格本身,它将被定位在其他网格之上。因此,我不想试图将这些线与其他网格对齐,只需要让这些网格通过它们的原点来对齐这些线。