2014-08-30 34 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 }); 
    } 

試一試,看看是否是你正在找。我建議你去做數據綁定,這會讓事情變得更容易。