WPF:如果宽高比 > 16:9 则拉伸矩形,否则缩放
WPF: Stretch rectangle if aspect ratio > 16:9, scale otherwise
我正在尝试将一个矩形放入 window 的网格中,该网格会定期更改大小。我使用的不是绝对值,而是比率。
因此,相对于 window/grid:
,矩形可能具有三种状态
- window 的默认宽高比是 16:9。如果 window 有那个尺寸,矩形应该完全适合 window,填充 window;
- 如果 window 的宽度大于该宽度,则矩形应随之拉伸。 (因此,如果 window 的宽高比 > 16/9,则矩形会拉伸其宽度,因此仍会填满整个 window);
- 如果 window 的高度大于 16:9 的比例,里面的矩形应该 (1) 不垂直拉伸,并且 (2) 对齐到网格的底部。
This image explains it a lot clearer
我正在寻找一种解决方案,它不涉及更改 XAML 以外的代码(因此 .cs 文件中没有任何内容),除非别无他法。不过,我确实尝试使用 C# 代码找到解决方案:
RectName_OnSizeChanged(object sender, SizeChangedEventArgs) {
RectName.MaxHeight = 9/16 * RectName.Width;
}
但它似乎不起作用。 (那是为什么,这是我的额外问题)
这个怎么样:
<Grid Background="CornflowerBlue" SizeChanged="ParentSizeChanged">
<Rectangle x:Name="theRect" Fill="Blue" HorizontalAlignment="Left" VerticalAlignment="Bottom" />
</Grid>
还有这个:
private void ParentSizeChanged(object sender, SizeChangedEventArgs e)
{
var parent = sender as FrameworkElement;
if (parent == null)
return;
theRect.Width = parent.ActualWidth;
theRect.Height = Math.Min(parent.ActualHeight, parent.ActualWidth * 6 / 9);
}
我正在尝试将一个矩形放入 window 的网格中,该网格会定期更改大小。我使用的不是绝对值,而是比率。
因此,相对于 window/grid:
,矩形可能具有三种状态- window 的默认宽高比是 16:9。如果 window 有那个尺寸,矩形应该完全适合 window,填充 window;
- 如果 window 的宽度大于该宽度,则矩形应随之拉伸。 (因此,如果 window 的宽高比 > 16/9,则矩形会拉伸其宽度,因此仍会填满整个 window);
- 如果 window 的高度大于 16:9 的比例,里面的矩形应该 (1) 不垂直拉伸,并且 (2) 对齐到网格的底部。
This image explains it a lot clearer
我正在寻找一种解决方案,它不涉及更改 XAML 以外的代码(因此 .cs 文件中没有任何内容),除非别无他法。不过,我确实尝试使用 C# 代码找到解决方案:
RectName_OnSizeChanged(object sender, SizeChangedEventArgs) {
RectName.MaxHeight = 9/16 * RectName.Width;
}
但它似乎不起作用。 (那是为什么,这是我的额外问题)
这个怎么样:
<Grid Background="CornflowerBlue" SizeChanged="ParentSizeChanged">
<Rectangle x:Name="theRect" Fill="Blue" HorizontalAlignment="Left" VerticalAlignment="Bottom" />
</Grid>
还有这个:
private void ParentSizeChanged(object sender, SizeChangedEventArgs e)
{
var parent = sender as FrameworkElement;
if (parent == null)
return;
theRect.Width = parent.ActualWidth;
theRect.Height = Math.Min(parent.ActualHeight, parent.ActualWidth * 6 / 9);
}