【问题标题】:Horizontal image scaling with ScaleTransform in WPF在 WPF 中使用 ScaleTransform 进行水平图像缩放
【发布时间】:2013-03-17 12:12:48
【问题描述】:

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

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

【问题讨论】:

    标签: c# .net wpf image


    【解决方案1】:

    你通常会这样做:

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

    如果你真的需要手动计算拉伸变换,你只需要一个ScaleTransform,不需要TranslateTransform,你可以把它放到Image控件的LayoutTransform中。此外,必须将 Image 控件放入 Grid 中,该 Grid 提供了 Windows 的“客户区”的大小。您无法根据窗口的宽度(或实际宽度)计算任何内容,因为其中包括窗口边框的宽度。

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

    【讨论】:

    • 正如问题中提到的,这对我来说应该是一次学习经历,因为我打算使用 RenderTransform 处理更复杂的问题。将转换更改为 LayoutTransform 会完全破坏它。
    • 那你为什么不从更简单的东西开始,也许是网格中心的一个固定大小的矩形。然后依次应用缩放、平移和旋转。这绝对简单。
    • 您可以在这篇 MSDN 文章中获得对 WPF 2-D 转换的全面解释:Transforms Overview
    猜你喜欢
    • 2021-03-12
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 2013-09-29
    • 2021-12-22
    • 1970-01-01
    • 2021-01-24
    • 2010-09-16
    相关资源
    最近更新 更多