添加子项后,画布的宽度为0。如何使画布重新计算宽度?

时间:2014-07-18 16:06:33

标签: c# wpf layout

我正在创建一个自定义画布,它动态添加了作为子项添加的形状(线条)。不幸的是,在添加子项后,画布的宽度为0,这是不可取的 理想情况下,画布应使用其子项的维度来更新其宽度。

如何修改我的画布以考虑其子画面的尺寸,然后更新其宽度?

正如我所说,我动态地更改了画布上的形状。每次使用回调函数更改其依赖项属性时,我都会这样做。

通常,这就是回调函数的样子:
这不是我的算法,但它应该证明这一点。

public void UpdateLines()
{
    for(int i = 0; i < NUM_BARS; i++)
    {
        Line bar = new Line();
        bar.Stroke = Brushes.Black;
        bar.StrokeThickness = 4;
        bar.X1 = 0;
        bar.X2 = ActualWidth;
        bar.Y1 = i * (bar.StrokeThickness + 2);
        bar.Y1 = bar.Y2;
        this.Children.Add(bar);
    }

    //[Inserted here]
}

接下来我注意到的是我可以添加一条长度很长的线,然后会显示该线,但画布宽度仍然为0。

在&#34;插入此处&#34; mark,我把这行代码测试一下:

Children.Add(new Line() { Stroke=Brushes.Black, 
                          StrokeThickness = 4, X1 = 0, X2 = 200, Y1 = 10, Y2 = 10 });

那么,为什么画布宽度没有正确更新?我需要用它来计算我的线条的大小。

非常感谢您的帮助。感谢。

1 个答案:

答案 0 :(得分:2)

请参阅MSDN上的Panels Overview页面以获取有关WPF Panel的更多帮助,但简而言之,Canvas Panel 在孩子身上调整自身的大小项目被添加(或在任何时间)。从链接页面:

  

画布不受其子画面大小的影响。因此,子元素可能会覆盖父Canvas的边界矩形之外的其他元素。

因此,您需要手动更新Canvas的大小,或者在添加子项时使用 自行调整大小的其他类型的布局Panel虽然Canvas是唯一允许用户将子控件放在其中的绝对位置的Panel

再次,从链接页面:

  

Canvas为任何Panel提供最灵活的布局支持。 “高度”和“宽度”属性用于定义画布的区域,而内部元素则指定相对于父画布区域的绝对坐标。四个附加属性Canvas.Left,Canvas.Top,Canvas.Right和Canvas.Bottom允许精确控制Canvas中的对象放置,允许开发人员在屏幕上精确定位和排列元素。