猿问

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

我希望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,尽管它不会裁剪其子级。


回首忆惘然
浏览 1750回答 3
3回答

慕森王

否,这是不可能的(请参见下面的MSDN片段)。但是,如果要具有滚动条和自动调整大小,请考虑改用Grid,并使用Margin属性将项目放置在此Grid上。Grid会告诉ScrollViewer他想要多大,然后您将画布总是会告诉ScrollViewer他不需要任何大小。::)网格让您同时享受两个世界-只要将所有元素放入单个单元格,您将同时获得:任意定位和自动调整大小。通常要记住,大多数面板控件(DockPanel,StackPanel等)都可以通过Grid控件实现。从MSDN:画布是唯一没有固有布局特征的面板元素。画布的默认“高度”和“宽度”属性为零,除非它是自动调整其子元素大小的元素的子元素。画布的子元素永远不会调整大小,它们只是位于其指定的坐标处。这为不需要或不需要固有大小限制或对齐的情况提供了灵活性。对于您希望子内容自动调整大小和对齐的情况,通常最好使用Grid元素。希望这可以帮助

红颜莎娜

我只是在这里复制illef的答案,但要回答PilotBob,您只需定义一个画布对象,就像这样public class CanvasAutoSize : Canvas{&nbsp; &nbsp; protected override System.Windows.Size MeasureOverride(System.Windows.Size constraint)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; base.MeasureOverride(constraint);&nbsp; &nbsp; &nbsp; &nbsp; double width = base&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .InternalChildren&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .OfType<UIElement>()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .Max(i => i.DesiredSize.Width + (double)i.GetValue(Canvas.LeftProperty));&nbsp; &nbsp; &nbsp; &nbsp; double height = base&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .InternalChildren&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .OfType<UIElement>()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .Max(i => i.DesiredSize.Height + (double)i.GetValue(Canvas.TopProperty));&nbsp; &nbsp; &nbsp; &nbsp; return new Size(width, height);&nbsp; &nbsp; }}然后在XAML中使用CanvasAutoSize。&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <local:CanvasAutoSize VerticalAlignment="Top" HorizontalAlignment="Left"></local:CanvasAutoSize>与上面介绍的使用网格的方法相比,我更喜欢这种解决方案,因为它通过附加属性工作,只需要在元素上设置较少的属性即可。
随时随地看视频慕课网APP
我要回答