2013-03-17 79 views
0

我在WPF窗口中使用默認的Stretch設置「統一」,並且正在嘗試使其水平填充屏幕。我不希望使用不同的Stretch設置,因爲這應該是一種學習體驗。正在加載的圖像尺寸是420x800。這是窗口中的XAML ..使用WPF中的ScaleTransform進行水平圖像縮放

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

我試圖瞭解如何拉伸和轉換一起工作,但我有這方面的困難。我很感謝所有的見解,甚至參考了詳細的解釋,因爲我無法找到任何信息來源,清楚而簡潔地解釋如何應用轉換。

回答

3

你通常會只是這樣做:

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

如果你真的需要手動計算拉伸改造,你只需要一個ScaleTransform,沒有TranslateTransform,你將它放入Image控件的LayoutTransform。此外,Image控件必須放置在一個Grid中,它提供了Windows「客戶區」的大小。您不能根據窗口寬度(或ActualWidth)計算任何東西,因爲它包含窗口邊框的寬度。

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

正如在問題中提到,這應該是我一個學習的過程,我打算使用的RenderTransform更復雜的問題着手。將轉換更改爲LayoutTransform完全破壞了這一點。 – 2013-03-17 13:23:11

+0

那麼爲什麼不從一個更簡單的東西開始,可能是一個網格中心的固定大小的矩形。然後繼續應用縮放,平移和可能的旋轉。這絕對是直接的。 – Clemens 2013-03-17 15:48:39

+0

您可能會在本文的MSDN文章中獲得有關WPF 2-D轉換的全面說明:[轉換概述](http://msdn.microsoft.com/zh-cn/library/ms750596.aspx)。 – Clemens 2013-03-17 16:17:16