为了账号安全,请及时绑定邮箱和手机立即绑定

WPF:如何使画布自动调整大小?

WPF:如何使画布自动调整大小?

回首忆惘然 2019-12-02 10:48:26
我希望Canvas自动将其大小调整为其项目的大小,以便ScrollViewer滚动条具有正确的范围。可以在XAML中完成吗?<ScrollViewer HorizontalScrollBarVisibility="Auto" x:Name="_scrollViewer">    <Grid x:Name ="_canvasGrid" Background="Yellow">        <Canvas x:Name="_canvas" HorizontalAlignment="Left" VerticalAlignment="Top" Background="Green"></Canvas>        <Line IsHitTestVisible="False" .../>    </Grid></ScrollViewer>在上面的代码中,画布始终为0,尽管它不会裁剪其子级。
查看完整描述

3 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

否,这是不可能的(请参见下面的MSDN片段)。但是,如果要具有滚动条和自动调整大小,请考虑改用Grid,并使用Margin属性将项目放置在此Grid上。Grid会告诉ScrollViewer他想要多大,然后您将画布总是会告诉ScrollViewer他不需要任何大小。::)


网格让您同时享受两个世界-只要将所有元素放入单个单元格,您将同时获得:任意定位和自动调整大小。通常要记住,大多数面板控件(DockPanel,StackPanel等)都可以通过Grid控件实现。


从MSDN:


画布是唯一没有固有布局特征的面板元素。画布的默认“高度”和“宽度”属性为零,除非它是自动调整其子元素大小的元素的子元素。画布的子元素永远不会调整大小,它们只是位于其指定的坐标处。这为不需要或不需要固有大小限制或对齐的情况提供了灵活性。对于您希望子内容自动调整大小和对齐的情况,通常最好使用Grid元素。


希望这可以帮助


查看完整回答
反对 回复 2019-12-02
?
红颜莎娜

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>

与上面介绍的使用网格的方法相比,我更喜欢这种解决方案,因为它通过附加属性工作,只需要在元素上设置较少的属性即可。


查看完整回答
反对 回复 2019-12-02
  • 3 回答
  • 0 关注
  • 1666 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信