以编程方式添加的在画布上绘制从网格到网格的线

本文关键字:网格 绘制 方式 编程 添加 | 更新日期: 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。它们的原点是网格本身,它将被定位在其他网格之上。因此,我不想试图将这些线与其他网格对齐,只需要让这些网格通过它们的原点来对齐这些线。