我有一个绑定到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>
所以我制作了多个网格,每个网格都有一个矩形。我将网格添加到绑定到Canvas的Grid List中。它们显得很好。 我用一个特殊的矩形制作一个特殊的网格,然后将它放在画布的远端。
这个特殊的网格将是我的&#34; TargetGrid&#34;。我希望我之前在集合中制作的每个网格都有一条独特的线从它们绘制到我的&#34;目标网格&#34;
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: 图片 http://imgur.com/GOnEmfp
答案 0 :(得分:0)
RC.X2 = p.X;
RC.Y2 = p.Y;
Canvas.SetLeft(g, Canvas.GetLeft(gr));
Canvas.SetTop(g, Canvas.GetTop(gr));
解决方案是将X1和Y1保持为0.它们的原点是网格本身,它将位于其他网格之上。因此,我不需要尝试将线条与其他网格对齐,而只需要让网格对齐线条,如果您将通过它们的原点。