如何扩展XAML元素以适应其容器?

时间:2018-05-25 19:55:51

标签: c# wpf xaml resize scaling

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

我有一个窗口,设计用于始终以相同的像素尺寸显示其内容,无论窗口的大小调整为何。而不是去改变每个XAML页面中的每个子元素,使其没有固定的大小,我想让主Grid缩放以适应窗口。到目前为止,获取具有固定尺寸的元素以显示不同尺寸的唯一方法是使用变换缩放,使用RenderTransformLayoutTransform。但是,如果我走这条路线,我将不得不在C#中对缩放进行编码以响应调整大小事件而不是自动发生。在XAML中是否有一些原生的内置方法可以做到这一点?这感觉就像我应该能够使用某些特殊属性,或者ContentControlContentPresenter

我见过Resize WPF Window and contents depening on screen resolution,但它询问传统的大小调整而不是缩放固定元素。我也见过How to make all controls resize accordingly proportionally when window is maximized?,虽然第二个答案至少谈到了处理调整大小事件的问题,但它有同样的问题。

以下是未按要求调整大小的固定维度子元素的简化示例:

<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>

实际结果:

Blue rectangle that's always the same size

期望的结果:

Blue rectangle that scales to fill its window

正如你所看到的,我正在寻找的是一种信箱效应,这意味着我希望保持宽高比。但是,我还没有找到一种方法来获得自动缩放,即使不用担心宽高比,所以我认为我会把信箱视为一种我后来会担心的第二阶段。

2 个答案:

答案 0 :(得分:2)

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

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

请注意,因为视图框正在缩放其内容传统的Grid行为,所以停止工作类似,因为内容的大小永远不会实际更改。

答案 1 :(得分:-1)

另一种选择是使用MultiValueConverter来设置高度和宽度。 您可以为转换器提供根容器als参数的ActualWidth和ActualHeight,并让它计算所需的宽高比。

描述MultiValueConverter的教程: http://www.wpftricks.com/2017/05/wpf-multivalueconverter.html