2017-09-03 115 views
0

在我的WPF應用程序,我想旋轉被放置在一個網格單元的圖像:在旋轉和自動縮放圖片

  • 使用RotateTransform直接:

    <Grid> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="50"/> 
         <RowDefinition/> 
        </Grid.RowDefinitions> 
        <Button Name="btnRotate" Click="btnRotate_Click">Rotate</Button> 
        <Image Grid.Row="1" Name="img" RenderTransformOrigin="0.5,0.5" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" /> 
    </Grid> 
    

    我嘗試了兩種思路Image集裝箱。不幸的是,這種轉換取消了容器的屬性VerticalAlignment="Stretch" HorizontalAlignment="Stretch",並且圖像超出了單元格邊界。

  • 在圖像的TransformedBitmap實例上使用RotateTransform。這個構造旋轉和自動縮放,但GC不收集舊的實例;所以它浪費了很多RAM功能。

這是我的第二個想法背後的代碼。如果它不會浪費那麼多RAM,那就沒問題。

private void btnRotate_Click(object sender, RoutedEventArgs e) 
{ 
    bmp = new TransformedBitmap(bmp, new RotateTransform(90)); 
    bmp.Freeze(); 
    img.Source = bmp; 
} 

那麼,在其佈局容器中使用自動縮放旋轉圖像的最佳做法是什麼?

+0

你有沒有用盡全力RenderTransform和LayoutTransform? – CShark

+0

我只使用RenderTransform。 – User95

+0

在WPF已經計算出所有尺寸和尺寸之後,RenderTransform會被應用。 LayoutTransform更改對象,然後根據更改計算大小。應該值得一試。 – CShark

回答

1

您可以嘗試使用LayoutTransform而不是RenderTransform。在WPF已經計算出各個對象的所有大小,位置和尺寸之後,RenderTransform中的轉換會得到應用,而LayoutTransform-Group中的轉換將在WPF執行所有這些計算之前應用。

0

要旋轉圖像,最好的方法就是讓WPF完成工作並使用LayoutTransform。

在XAML中,你必須與旋轉的信息添加Image.LayoutTranform標籤:

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="50"/> 
     <RowDefinition/> 
    </Grid.RowDefinitions> 
    <Button Name="btnRotate" Click="btnRotate_Click">Rotate</Button> 
    <Image Grid.Row="1" Name="img" RenderTransformOrigin="0.5,0.5" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"> 
     <Image.LayoutTransform> 
      <RotateTransform Angle="0"/> 
     </Image.LayoutTransform> 
    </Image> 
</Grid> 

在C#中,你可以改變現在的點擊動作旋轉:

private void btnRotate_Click(object sender, RoutedEventArgs e) 
    { 
     double rotation = (double)img.LayoutTransform.GetValue(RotateTransform.AngleProperty); 
     rotation += 90; 
     img.LayoutTransform.SetValue(RotateTransform.AngleProperty, rotation % 360); 
    }