2014-08-30 33 views
0

我试图在左,右,上,下方向上创建矩形的翻转副本。在WPF中使用ScaleTransform的矩形的翻转副本

但是我能够做到这一点,当选定的矩形没有事先转换应用于它。

但是,一旦矩形正在被ScaleTransform转换,我试着再次向所需方向翻转,该解决方案对我无效。

请纠正我在做什么错在这里。

这里是我使用

XAML

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition></ColumnDefinition> 
     <ColumnDefinition Width="10"></ColumnDefinition> 
     <ColumnDefinition Width="Auto"></ColumnDefinition> 
    </Grid.ColumnDefinitions> 

    <Canvas Name="canvas" Background="LightGray" MouseDown="Canvas_MouseDown"> 
     <Rectangle x:Name="rect" StrokeThickness="2" Stroke="Black" Height="60" Width="100" Canvas.Left="500" Canvas.Top="300" MouseDown="rect_MouseDown"> 
      <Rectangle.Fill> 
       <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1"> 
        <GradientStop Color="#FFFB7D0E" Offset="0" /> 
        <GradientStop Color="#FF59C103" Offset="1" /> 
        <GradientStop Color="#FFFFFFFF" Offset="0.51" /> 
       </LinearGradientBrush> 
      </Rectangle.Fill> 
     </Rectangle> 
    </Canvas> 

    <StackPanel Grid.Column="2">   
     <Button Content="Left" Click="Button_Click"></Button> 
     <Button Content="Right" Click="Button_Click"></Button> 
     <Button Content="Up" Click="Button_Click"></Button> 
     <Button Content="Down" Click="Button_Click"></Button> 
    </StackPanel>    
</Grid> 

代码C#

Rectangle selectedRect; 

    //Flip 
    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     if (selectedRect == null) 
      return; 

     //Create a copy of rectangle 
     string rectXaml = XamlWriter.Save(selectedRect); 
     StringReader stringReader = new StringReader(rectXaml); 
     XmlReader xmlReader = XmlReader.Create(stringReader); 
     Rectangle newRect = (Rectangle)XamlReader.Load(xmlReader); 

     //Calculate the bounding box 
     var boundingRect = newRect.RenderTransform.TransformBounds(new Rect(0, 0, newRect.Width, newRect.Height)); 

     double cX, cY, sX, sY; 
     sX = 1; 
     sY = 1; 
     cX = (boundingRect.Left + boundingRect.Right)/2; 
     cY = (boundingRect.Top + boundingRect.Bottom)/2; 

     switch ((sender as Button).Content.ToString()) 
     { 
      case "Up": 
       sX = 1; 
       sY = -1; 
       cY = boundingRect.Top; 
       break; 

      case "Down": 
       sX = 1; 
       sY = -1; 
       cY = boundingRect.Bottom; 
       break; 

      case "Left": 
       sX = -1; 
       sY = 1; 
       cX = boundingRect.Left; 
       break; 

      case "Right": 
       sX = -1; 
       sY = 1; 
       cX = boundingRect.Right; 
       break; 
     } 

     newRect.Stroke = Brushes.Black; 
     newRect.RenderTransform = new ScaleTransform(sX, sY, cX, cY);    
     newRect.MouseDown += new MouseButtonEventHandler(rect_MouseDown); 

     //Add new rect to Canvas 
     canvas.Children.Add(newRect); 
    } 

    //To select a rectangle on canvas 
    private void rect_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     if (selectedRect != null) 
      selectedRect.Stroke = Brushes.Black; 

     selectedRect = sender as Rectangle; 
     selectedRect.Stroke = Brushes.Blue; 
     e.Handled = true; 
    } 

    //clear the selection 
    private void Canvas_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     if (selectedRect != null) 
     { 
      selectedRect.Stroke = Brushes.Black; 
      selectedRect = null; 
     } 
     e.Handled = true; 
    } 

回答

0

在你的代码的问题是,你试图再次翻转翻转,但所使用的转换不会翻转。还没有设置画布位置以获得所需的。

我曾尝试重写代码,这种方式会从中心翻转的矩形,并通过帆布位置属性移动即离开&顶部

private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     if (selectedRect == null) 
      return; 

     //Create a copy of rectangle 
     string rectXaml = XamlWriter.Save(selectedRect); 
     StringReader stringReader = new StringReader(rectXaml); 
     XmlReader xmlReader = XmlReader.Create(stringReader); 
     Rectangle newRect = (Rectangle)XamlReader.Load(xmlReader); 

     double cX, cY, sX, sY; 
     sX = 1; 
     sY = 1; 
     cX = newRect.Width/2; 
     cY = newRect.Height/2; 

     double top = Canvas.GetTop(selectedRect); 
     double left = Canvas.GetLeft(selectedRect); 

     switch ((sender as Button).Content.ToString()) 
     { 
      case "Up": 
       sX = 1; 
       sY = -1; 
       top -= selectedRect.Height; 
       break; 

      case "Down": 
       sX = 1; 
       sY = -1; 
       top += selectedRect.Height; 
       break; 

      case "Left": 
       sX = -1; 
       sY = 1; 
       left -= selectedRect.Width; 
       break; 

      case "Right": 
       sX = -1; 
       sY = 1; 
       left += selectedRect.Width; 
       break; 
     } 
     Canvas.SetLeft(newRect, left); 
     Canvas.SetTop(newRect, top); 

     newRect.Stroke = Brushes.Black; 
     ScaleTransform trans = newRect.RenderTransform as ScaleTransform; 
     if (trans != null) 
     { 
      //flip the previous transform 
      trans.ScaleX *= sX; 
      trans.ScaleY *= sY; 
     } 
     else 
     { 
      //create a new if none 
      trans = new ScaleTransform(sX, sY, cX, cY); 
     } 
     newRect.RenderTransform = trans; 
     newRect.MouseDown += new MouseButtonEventHandler(rect_MouseDown); 

     //Add new rect to Canvas 
     canvas.Children.Add(newRect); 

     //optional to set the new rect as selected for continuous flip copy 
     newRect.RaiseEvent(new MouseButtonEventArgs(Mouse.PrimaryDevice, 0, MouseButton.Left) { RoutedEvent = Rectangle.MouseDownEvent }); 
    } 

试一试,看看是否是你正在找。我建议你去做数据绑定,这会让事情变得更容易。