C# 如何让XAML元素进行缩放以适合其容器?

C# 如何让XAML元素进行缩放以适合其容器?,c#,wpf,xaml,resize,scaling,C#,Wpf,Xaml,Resize,Scaling,我知道有多种方法可以根据父元素调整子元素的大小。例如,如果使用网格,可以使用行和列定义,并且可以在自动大小、固定大小或“星形”大小方面获得很多自由。但是,如果子元素本身具有固定的宽度和高度,那么父元素是否告诉子元素填充所有可用空间就无关紧要了。子元素的大小将保持不变 我有一个窗口,无论窗口大小如何,它总是以相同的像素尺寸显示其内容。与其去改变每个XAML页面中的每个子元素,使其没有固定的大小,我想让主Grid只缩放以适应窗口。到目前为止,使具有固定尺寸的元素以不同尺寸显示的唯一方法是使用变换缩放

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

我有一个窗口,无论窗口大小如何,它总是以相同的像素尺寸显示其内容。与其去改变每个XAML页面中的每个子元素,使其没有固定的大小,我想让主
Grid
只缩放以适应窗口。到目前为止,使具有固定尺寸的元素以不同尺寸显示的唯一方法是使用变换缩放,可以使用
RenderTransform
layoututtransform
。但如果我走这条路,我将不得不用C#编写伸缩代码,以响应调整大小的事件,而不是让它自动发生。在XAML中是否有一些本地内置的方法来实现这一点?这感觉像是我应该能够用一些特殊属性,或者
ContentControl
ContentPresenter
来做的事情

我见过,但它询问的是传统的调整大小,而不是缩放固定元素。我也看到了同样的问题,尽管第二个答案至少谈到了处理调整大小事件

下面是一个未按需要调整大小的固定维度子元素的简化示例:

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

实际结果:

预期结果:


正如你所看到的,我所寻找的是一种字母盒效应,这意味着我希望保持纵横比。然而,我还没有找到一种方法来自动缩放,即使不担心长宽比,所以我想我会把装箱拳看作是我以后会担心的第二阶段。

< P>你正在寻找的控件是一个。它会增长以填充其容器(您可以为字母盒设置拉伸样式),并相应地缩放其所有内容。只需将其作为应用程序的根元素(或任何您想要的元素):


//或者别的什么

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

另一个选项是使用多值转换器设置高度和宽度。 您可以为转换器提供根容器als参数的ActualWidth和ActualHeight,并让它计算所需的纵横比

介绍多值转换器的教程:

这太棒了!我很可能会认为这是正确的,但我通常会等一天左右给别人一个机会。不过,我有一个小问题。有没有办法控制页边空白处的内容,好像主视图框占据了第1列,我想要一个简单的渐变图像进入第0列和第2列?@KyleDelaney可能没有你建议的那么干净;但是viewbox与其他控件一样是一个控件。例如,您可以将图像作为
窗口的背景,它将显示在“边距”中好吧,我想这会变得复杂,但是如果我将Viewbox放在两个星形列之间的网格的自动列中,它的行为与所需的一样,但仅适用于左右边距。当X维度不够宽时,它会被截断。@KyleDelaney是否也会插入一些*行?不太确定你需要/正在那里寻找什么好的,我知道了。
Viewbox
位于两个*列之间的自动列中,如我所说。然后将三列
网格
放置在另一个
视图框
中,当窗口变得太窄时,该视图框会缩小;对于一个有现成解决方案的问题来说,这种方法过于复杂了。它也不能解决缩放内容的问题
<Viewbox>
    <Grid> //Or whatever
         <OtherStuff>
    </Grid>
</Viewbox>