2013-10-23 46 views
0

我有用于将图像定义XAML如下:对于变焦应用缩放,也翻转图像wpf?

<ControlTemplate> 
       <Grid>     
        <Image x:Name="documentPage" Source="{Binding ImageSource}" 
          VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Stretch="Fill">  
         <Image.LayoutTransform> 
          <TransformGroup> 
           <ScaleTransform ScaleX="{Binding ScaleFactor}" ScaleY="{Binding ScaleFactor}"/> 
          </TransformGroup> 
         </Image.LayoutTransform> 
        </Image>      
       </Grid> 
      </ControlTemplate> 

和上的按钮或缩小我递增0.1比例因子(放大)或递减0.1(缩小)。

现在我也想申请翻转图像,以及...像垂直或水平翻转....我该怎么办呢? 谢谢!

+0

你总是可以否定你的布局规模的x/y属性变换 – Andy

回答

4

,你已经应用到LayoutTransform你可以把尽可能多的大规模改造,只要你想,你可以结合另一规模改造,以财产的TransformGroup内。

<Image.LayoutTransform> 
    <TransformGroup> 
     <ScaleTransform ScaleX="{Binding ScaleFactor}" ScaleY="{Binding ScaleFactor}"/> 
     <ScaleTransform ScaleX="-1" ScaleY="1"/> 
    </TransformGroup> 
</Image.LayoutTransform> 

,而不是-1和1在第二变换它们绑定到一个属性在您的视图模型(显然是一个转换器将如果你的flipx和flipy性质是布尔需要)

在这里,我已经创建一个简单的例子,显示您的问题中使用转换器将布尔属性转换为比例尺的所有功能,以转换ScaleX和ScaleY。

enter image description here

XAML

<Window x:Class="flipx.MainWindow" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:local="clr-namespace:flipx" 
      DataContext="{Binding RelativeSource={RelativeSource Self}}" 
      Title="MainWindow" Height="350" Width="525"> 
     <Grid> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="*"/> 
       <RowDefinition Height="30"/> 
      </Grid.RowDefinitions> 
      <Ellipse Grid.Row="0" Width="100" Height="100"> 
       <Ellipse.Fill> 
        <LinearGradientBrush > 
         <GradientStop Color="Red"/> 
         <GradientStop Color="#FF2300FF" Offset="1"/> 
        </LinearGradientBrush> 
       </Ellipse.Fill> 
       <Ellipse.LayoutTransform> 
        <TransformGroup> 
         <ScaleTransform ScaleX="{Binding ScaleFactor}" ScaleY="{Binding ScaleFactor}"/> 
         <ScaleTransform ScaleX="{Binding FlipX, Converter={local:BooleanToScaleConverter}}" ScaleY="{Binding FlipY, Converter={local:BooleanToScaleConverter}}"/> 
        </TransformGroup> 
       </Ellipse.LayoutTransform> 
      </Ellipse> 

      <StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Center"> 
       <CheckBox Margin="5" IsChecked="{Binding FlipX}">FlipX</CheckBox> 
       <CheckBox Margin="5" IsChecked="{Binding FlipY}">FlipY</CheckBox>   
       <Slider Minimum="0.001" Maximum="5" Value="{Binding ScaleFactor}" Width="150"/> 
      </StackPanel> 
     </Grid> 

    </Window> 

C#

using System; 
using System.Windows; 
using System.Windows.Data; 
using System.Windows.Markup; 

namespace flipx 
{ 
    public class BooleanToScaleConverter : MarkupExtension, IValueConverter 
    { 
     static BooleanToScaleConverter converter; 

     public BooleanToScaleConverter() { } 

     public override object ProvideValue(IServiceProvider serviceProvider) 
     { 
      if (converter == null) converter = new BooleanToScaleConverter(); 
      return converter; 
     } 

     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      bool boolValue = (bool)value; 
      return boolValue ? -1 : 1; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 

    public partial class MainWindow : Window 
    { 
     public double ScaleFactor 
     { 
      get { return (double)GetValue(ScaleFactorProperty); } 
      set { SetValue(ScaleFactorProperty, value); } 
     } 
     public static readonly DependencyProperty ScaleFactorProperty = 
      DependencyProperty.Register("ScaleFactor", typeof(double), typeof(MainWindow), new PropertyMetadata(1d)); 

     public bool FlipX 
     { 
      get { return (bool)GetValue(FlipXProperty); } 
      set { SetValue(FlipXProperty, value); } 
     } 
     public static readonly DependencyProperty FlipXProperty = 
      DependencyProperty.Register("FlipX", typeof(bool), typeof(MainWindow), new PropertyMetadata(false)); 

     public bool FlipY 
     { 
      get { return (bool)GetValue(FlipYProperty); } 
      set { SetValue(FlipYProperty, value); } 
     }   
     public static readonly DependencyProperty FlipYProperty = 
      DependencyProperty.Register("FlipY", typeof(bool), typeof(MainWindow), new PropertyMetadata(false)); 

     public MainWindow() 
     { 
      InitializeComponent(); 
     } 
    } 
} 
+0

感谢安迪......你能详细一点。 ..我是新来的wpf ...我如何使用转换器?再次感谢... – user1202434

+0

你的观点结合的性质在不具有完全匹配类型的视图模型的属性时,使用转换器(或你想要做一些其他操作),这也正是它听起来像它它只是将视图模型属性转换为视图的其他内容。 – Andy

+0

我希望我能多劳多得。感谢百万帮助初学者。再次感谢 – user1202434