3 回答
TA贡献1777条经验 获得超3个赞
否,这是不可能的(请参见下面的MSDN片段)。但是,如果要具有滚动条和自动调整大小,请考虑改用Grid,并使用Margin属性将项目放置在此Grid上。Grid会告诉ScrollViewer他想要多大,然后您将画布总是会告诉ScrollViewer他不需要任何大小。::)
网格让您同时享受两个世界-只要将所有元素放入单个单元格,您将同时获得:任意定位和自动调整大小。通常要记住,大多数面板控件(DockPanel,StackPanel等)都可以通过Grid控件实现。
从MSDN:
画布是唯一没有固有布局特征的面板元素。画布的默认“高度”和“宽度”属性为零,除非它是自动调整其子元素大小的元素的子元素。画布的子元素永远不会调整大小,它们只是位于其指定的坐标处。这为不需要或不需要固有大小限制或对齐的情况提供了灵活性。对于您希望子内容自动调整大小和对齐的情况,通常最好使用Grid元素。
希望这可以帮助
TA贡献1842条经验 获得超12个赞
我只是在这里复制illef的答案,但要回答PilotBob,您只需定义一个画布对象,就像这样
public class CanvasAutoSize : Canvas
{
protected override System.Windows.Size MeasureOverride(System.Windows.Size constraint)
{
base.MeasureOverride(constraint);
double width = base
.InternalChildren
.OfType<UIElement>()
.Max(i => i.DesiredSize.Width + (double)i.GetValue(Canvas.LeftProperty));
double height = base
.InternalChildren
.OfType<UIElement>()
.Max(i => i.DesiredSize.Height + (double)i.GetValue(Canvas.TopProperty));
return new Size(width, height);
}
}
然后在XAML中使用CanvasAutoSize。
<local:CanvasAutoSize VerticalAlignment="Top" HorizontalAlignment="Left"></local:CanvasAutoSize>
与上面介绍的使用网格的方法相比,我更喜欢这种解决方案,因为它通过附加属性工作,只需要在元素上设置较少的属性即可。
- 3 回答
- 0 关注
- 1749 浏览
添加回答
举报