c# - 如何让 XAML 元素缩放以适应其容器?
问题描述
我知道有多种方法可以根据父元素调整子元素的大小。例如,如果您使用网格,则可以使用行和列定义,并且您可以在自动尺寸或固定尺寸或“星形”尺寸方面获得很多自由。但是,如果子元素本身具有固定的宽度和高度,那么如果父元素告诉子元素填充所有可用空间,则无关紧要。子元素将保持相同的大小。
我有一个窗口,该窗口旨在始终以相同的像素尺寸显示其内容,无论窗口大小调整为多大。与其去更改每个 XAML 页面中的每个子元素,使其没有固定大小,不如让主元素Grid
仅缩放以适应窗口。到目前为止,让具有固定尺寸的元素以不同尺寸显示的唯一方法是使用 Transform 缩放,可以使用 aRenderTransform
或 a LayoutTransform
。但如果我走这条路,我将不得不在 C# 中编写缩放以响应调整大小事件,而不是让它自动发生。在 XAML 中是否有一些本机内置方法可以做到这一点?这感觉就像我应该能够用一些特殊属性做的事情,或者也许是 a ContentControl
or 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>
实际结果:
期望的结果:
如您所见,我正在寻找的是一种信箱效果,这意味着我希望保持纵横比。但是,即使不担心纵横比,我也没有找到一种自动缩放的方法,所以我认为我会考虑将信箱处理作为我稍后会担心的第二阶段。
解决方案
您要查找的控件是Viewbox
. 它会增长以填充其容器(您可以为信箱设置拉伸样式)并相应地缩放其所有内容。只需将其作为应用程序的根元素(或任何您想要扩展的元素):
<Viewbox>
<Grid> //Or whatever
<OtherStuff>
</Grid>
</Viewbox>
请注意,由于视图框正在缩放其内容,因此传统Grid
行为和类似行为将停止工作,因为内容的大小实际上从未改变。
推荐阅读
- google-cloud-storage - 将数据从 Azure VM 提取到 Google 云存储
- django - 自定义 Django 登录模板
- go - 如何获取路线的所有可用方法?
- python - pytest-xdist 管理文件顺序
- laravel - 为什么“日期”为“2021-07-20”(在 mysql db 中)在 laravel“echo”中显示为“2021-07-19T22:00:00.000000Z”?
- javascript - 花括号的正则表达式
- javascript - 谷歌浏览器扩展 - 我可以制作后台脚本来不断地从 DOM 中获取元素吗?
- mongodb - Spring MongoDB Embedded 文档变得空或空白
- java - 我怎样才能制作多个循环?
- graphql - 通过批处理相同的类型从远程服务器加入模式