2016-03-02 80 views
0

我有這樣的代碼,在畫布上顯示一個矩形:模擬一個螺旋槳

XAML:

<Window x:Class="rotateRect.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:rotateRect" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="402.027" Width="600.676"> 
<Grid> 

    <Canvas Name="my_c" HorizontalAlignment="Left" Height="24" Margin="160,149,0,0" VerticalAlignment="Top" Width="177" RenderTransformOrigin="0.5,0.5"> 
     <Canvas.RenderTransform> 
      <TransformGroup> 
       <ScaleTransform/> 
       <SkewTransform/> 
       <RotateTransform Angle="-68.962"/> 
       <TranslateTransform/> 
      </TransformGroup> 
     </Canvas.RenderTransform> 
    </Canvas> 

</Grid> 

我可以用 「的RenderTransform」 把它在XAML。但我想在c#中實現這種旋轉並創建一個「螺旋槳」。我試圖爲畫布找到關於「RotateTransform」的信息。蒂斯是我的C#代碼:

C#:

using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Media; 
using System.Windows.Shapes; 

namespace rotateRect 
{ 
    public partial class MainWindow : Window 
    { 
     Rectangle my_r = new Rectangle(); 

     public MainWindow() 
     { 
      InitializeComponent(); 
      initializeRect(my_r, my_c); 
     } 

     private void initializeRect(Rectangle r, Canvas c) 
     { 
      // rectangle 
      r.Width = 10; 
      r.Height = 50; 

      // rectangle Color 
      r.Fill = new SolidColorBrush(Color.FromRgb(0, 0, 255)); 

      // canvas 
      c.Children.Add(r); 
      c.Width = 10; 
      c.Height = 50; 
     } 
    } 
} 

我發現「RotateTransform」的個例的位圖對象,但我還沒有找到一個帆布什麼。 C#, rotating Graphics?

可以將RotateTransform應用於c#中的畫布嗎?

回答

0

修改initializeRect梅索德

private void initializeRect(Rectangle r, Canvas c) 
     { 
      // rectangle 
      r.Width = 10; 
      r.Height = 50; 

      // rectangle Color 
      r.Fill = new SolidColorBrush(Color.FromRgb(0, 0, 255)); 

      // canvas 
      c.Children.Add(r); 
      c.Width = 10; 
      c.Height = 50; 

      RotateTransform rt = new RotateTransform(); 
      rt.Angle=-68.962; 
      c.RenderTransform = rt; 
     } 
+0

非常感謝!它工作得很好。 – Jguillot

0

通過 '推進器' 你的意思動畫?爲此,你需要動畫。只有RotateTransform是不夠的。

例如,讓我們來複制你的畫布與矩形,但在XAML:

<Canvas Name="cnvs" VerticalAlignment="Center" HorizontalAlignment="Center" 
     Loaded="cnvs_Loaded"> 
    <Canvas.Resources> 
     <DoubleAnimation x:Key="rotator" From="0" To="360" Duration="0:0:1" 
         AutoReverse="False" RepeatBehavior="Forever" /> 
    </Canvas.Resources> 
    <Canvas.RenderTransform> 
     <RotateTransform x:Name="canvasRotation" /> 
    </Canvas.RenderTransform> 

    <Rectangle Width="10" Height="50" Fill="Blue" /> 
</Canvas> 

,並開始我們的Loaded事件處理動畫。帆布有它自己的大小怪癖,所以我們需要設置的centerX和CenterY poperties我們的變換:

private void cnvs_Loaded(object sender, RoutedEventArgs e) 
{ 
    var canvas = (Canvas) sender; 
    var animation = canvas.Resources["rotator"] as DoubleAnimation; 

    var children = canvas.Children.OfType<FrameworkElement>().ToArray(); 
    canvasRotation.CenterX = children.Max(c => c.ActualWidth)/2; 
    canvasRotation.CenterY = children.Max(c => c.ActualHeight)/2; 

    canvasRotation.BeginAnimation(RotateTransform.AngleProperty, animation); 
} 


但是你真的在這裏需要一個帆布?我們可以簡化事情電網,例如:

<Grid Name="grid" VerticalAlignment="Top" HorizontalAlignment="Left" 
     Loaded="grid_Loaded" RenderTransformOrigin="0.5,0.5"> 
    <Grid.Resources> 
     <DoubleAnimation x:Key="rotator" From="0" To="360" Duration="0:0:1" 
         AutoReverse="False" RepeatBehavior="Forever" /> 
    </Grid.Resources> 
    <Grid.RenderTransform> 
     <RotateTransform x:Name="gridRotation" /> 
    </Grid.RenderTransform> 

    <Rectangle Width="10" Height="50" Fill="Blue" /> 
</Grid> 

而且

private void grid_Loaded(object sender, RoutedEventArgs e) 
{ 
    var g = (Grid) sender; 
    var animation = g.Resources["rotator"] as DoubleAnimation;   
    gridRotation.BeginAnimation(RotateTransform.AngleProperty, animation); 
} 

或者動畫只是Recntagle如果它是你必須在容器中的唯一對象。沒有必要使事情複雜化。

+0

嗨,謝謝你的回答。 爲了模擬「螺旋槳」,我創建了一個像這樣的「計時器」:http://www.wpf-tutorial.com/misc/dispatchertimer/ 它啓動我的功能「螺旋槳」每個勾號。這模擬了一個像螺旋槳一樣旋轉的矩形。我沒有添加到我的代碼,因爲我不想收取它。 我可以在上面編輯我的代碼,告訴你我是如何實現它的。 – Jguillot

+0

@Jguillot,不需要,在代碼背後創建控件並用定時器對它們進行動畫處理也是WinForms-ey,而不是WPF方法。但是,你可以自由地以任何你喜歡的方式實現它,當然。 – icebat