在WPF中使用ScaleTransform进行水平图像缩放
本文关键字:水平 图像 缩放 ScaleTransform WPF | 更新日期: 2023-09-27 18:04:13
我在WPF窗口中有一个图像,默认的Stretch
设置,统一,并且正在尝试使其水平填充屏幕。我不希望使用不同的Stretch
设置,因为这应该是一个学习经验。加载的图像尺寸为420x800
。这是窗口的XAML ..
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Background="Red" Height="1200" Width="840">
<Image Name="Image" Source="{Binding SourceUri}">
<Image.RenderTransform>
<TransformGroup>
<ScaleTransform x:Name="Scale" />
<TranslateTransform x:Name="Translate" />
</TransformGroup>
</Image.RenderTransform>
</Image>
</Window>
在代码后面,我试图计算缩放图像以填充水平屏幕的比例,我使用平移变换将其移动到屏幕的中心。下面的代码显然是错误的…
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
namespace WpfApplication1 {
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
DataContext = this;
double ImageWidth = 420;
Scale.ScaleX = Width / ImageWidth;
Translate.X = -(ImageWidth / 2);
}
public string SourceUri {
get {
return @"C:'Users'Roel'Desktop'test.png";
}
}
}
}
我正试图理解拉伸和转换是如何一起工作的,但我对此有困难。我将感谢所有的见解,甚至是详细解释的参考,因为我很难找到任何信息来源来清楚而简洁地解释如何应用转换。
您通常会这样做:
<Image Name="Image" Source="{Binding SourceUri}" Stretch="Fill"/>
如果你真的需要手动计算拉伸变换,你只需要一个ScaleTransform
,没有TranslateTransform
,你会把它放到图像控件的LayoutTransform
中。此外,图像控件必须放置在网格中,网格提供了Windows"客户端区域"的大小。你不能计算任何基于窗口的宽度(或ActualWidth),因为它包括窗口的边界的宽度。
<Grid SizeChanged="Grid_SizeChanged">
<Image Name="image" Source="{Binding SourceUri}">
<Image.LayoutTransform>
<ScaleTransform x:Name="scale"/>
</Image.LayoutTransform>
</Image>
</Grid>
在Grid的sizechange处理程序中,您将按照如下所示计算缩放。
private void Grid_SizeChanged(object sender, SizeChangedEventArgs e)
{
scale.ScaleX = e.NewSize.Width / image.Source.Width;
scale.ScaleY = e.NewSize.Height / image.Source.Height;
}