我正在创建一个自定义画布,它动态添加了作为子项添加的形状(线条)。不幸的是,在添加子项后,画布的宽度为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 });
那么,为什么画布宽度没有正确更新?我需要用它来计算我的线条的大小。
非常感谢您的帮助。感谢。
答案 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中的对象放置,允许开发人员在屏幕上精确定位和排列元素。