首页 > 解决方案 > 如何让 XAML 元素缩放以适应其容器?

问题描述

我知道有多种方法可以根据父元素调整子元素的大小。例如,如果您使用网格,则可以使用行和列定义,并且您可以在自动尺寸或固定尺寸或“星形”尺寸方面获得很多自由。但是,如果子元素本身具有固定的宽度和高度,那么如果父元素告诉子元素填充所有可用空间,则无关紧要。子元素将保持相同的大小。

我有一个窗口,该窗口旨在始终以相同的像素尺寸显示其内容,无论窗口大小调整为多大。与其去更改每个 XAML 页面中的每个子元素,使其没有固定大小,不如让主元素Grid仅缩放以适应窗口。到目前为止,让具有固定尺寸的元素以不同尺寸显示的唯一方法是使用 Transform 缩放,可以使用 aRenderTransform或 a LayoutTransform。但如果我走这条路,我将不得不在 C# 中编写缩放以响应调整大小事件,而不是让它自动发生。在 XAML 中是否有一些本机内置方法可以做到这一点?这感觉就像我应该能够用一些特殊属性做的事情,或者也许是 a ContentControlor ContentPresenter

我已经看到Resize WPF Window 和 content 取决于屏幕分辨率,但它询问的是常规调整大小而不是缩放固定元素。我还看到了当窗口最大化时如何使所有控件按比例调整大小?尽管第二个答案至少谈到了处理调整大小事件,但这也有同样的问题。

这是一个固定尺寸的子元素未按需要调整大小的简化示例:

<Window x:Class="WpfTest.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="Window1" Height="200" Width="300" Background="LightBlue">
    <Grid>
        <Frame Background="Blue" Width="200" Height="100">

        </Frame>
    </Grid>
</Window>

实际结果:

始终相同大小的蓝色矩形

期望的结果:

缩放以填充其窗口的蓝色矩形

如您所见,我正在寻找的是一种信箱效果,这意味着我希望保持纵横比。但是,即使不担心纵横比,我也没有找到一种自动缩放的方法,所以我认为我会考虑将信箱处理作为我稍后会担心的第二阶段。

标签: c#wpfxamlresizescaling

解决方案


您要查找的控件是Viewbox. 它会增长以填充其容器(您可以为信箱设置拉伸样式)并相应地缩放其所有内容。只需将其作为应用程序的根元素(或任何您想要扩展的元素):

<Viewbox>
    <Grid> //Or whatever
         <OtherStuff>
    </Grid>
</Viewbox>

请注意,由于视图框正在缩放其内容,因此传统Grid行为和类似行为将停止工作,因为内容的大小实际上从未改变。


推荐阅读