在WPF中使用ScaleTransform进行水平图像缩放

时间:2013-03-17 12:12:48

标签: c# .net wpf image

我在WPF窗口中有一个图像,其默认Stretch设置为Uniform,并且正在尝试使其水平填充屏幕。我不希望使用不同的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>

在代码隐藏中,我正在尝试计算缩放以缩放图像以填充水平屏幕,我正在使用translate transform将其移动到屏幕中心。以下代码显然是错误的......

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";
            }
        }
    }
}

我试图了解拉伸和变换是如何协同工作的,但我对此有困难。我很感激所有的见解,甚至是对详细解释的参考,因为我很难找到任何信息来源,清楚而简明地解释如何应用转换。

1 个答案:

答案 0 :(得分:3)

你通常会这样做:

<Image Name="Image" Source="{Binding SourceUri}" Stretch="Fill"/>

如果您确实需要手动计算拉伸变换,则只需要ScaleTransform,不需要TranslateTransform,然后将其放入Image控件的LayoutTransform。此外,必须将Image控件放入Grid中,Grid提供Windows“客户区”的大小。您无法根据Window的宽度(或ActualWidth)计算任何内容,因为它包含Window边框的宽度。

<Grid SizeChanged="Grid_SizeChanged">
    <Image Name="image" Source="{Binding SourceUri}">
        <Image.LayoutTransform>
            <ScaleTransform x:Name="scale"/>
        </Image.LayoutTransform>
    </Image>
</Grid>

在Grid的SizeChanged处理程序中,您将计算缩放比例,如下所示。

private void Grid_SizeChanged(object sender, SizeChangedEventArgs e)
{
    scale.ScaleX = e.NewSize.Width / image.Source.Width;
    scale.ScaleY = e.NewSize.Height / image.Source.Height;
}