2011-08-23 188 views
5

幫我看看。我需要在z軸上旋轉按鈕的旋轉而不使用外部庫,只能使用C#和xaml代碼。WPF旋轉按鈕

這可能嗎?我怎樣才能做到這一點?

謝謝。

回答

11

已經在鏈接一看Viewport2DVisual3D

的例子正是這麼做的。

編輯:這裏是從與Z的添加動畫鏈接軸

的例子看起來這
enter image description here

<Viewport3D> 
    <Viewport3D.Camera> 
     <PerspectiveCamera Position="0, 0, 4"/> 
    </Viewport3D.Camera> 
    <Viewport2DVisual3D x:Name="v2dv3d"> 
     <Viewport2DVisual3D.Transform> 
      <RotateTransform3D> 
       <RotateTransform3D.Rotation> 
        <AxisAngleRotation3D Angle="0" Axis="0, 1, 0" /> 
       </RotateTransform3D.Rotation> 
      </RotateTransform3D> 
     </Viewport2DVisual3D.Transform> 
     <Viewport2DVisual3D.Geometry> 
      <MeshGeometry3D Positions="-1,1,0 -1,-1,0 1,-1,0 1,1,0" 
        TextureCoordinates="0,0 0,1 1,1 1,0" TriangleIndices="0 1 2 0 2 3"/> 
     </Viewport2DVisual3D.Geometry> 

     <Viewport2DVisual3D.Material> 
      <DiffuseMaterial Viewport2DVisual3D.IsVisualHostMaterial="True" Brush="White"/> 
     </Viewport2DVisual3D.Material> 
     <Button Content="Hello, 3D"> 
      <Button.Triggers> 
       <EventTrigger RoutedEvent="FrameworkElement.Loaded"> 
        <BeginStoryboard> 
         <Storyboard RepeatBehavior="Forever"> 
          <Rotation3DAnimation Storyboard.TargetName="v2dv3d" 
                Storyboard.TargetProperty="(Viewport2DVisual3D.Transform).(RotateTransform3D.Rotation)" 
                Duration="0:0:2" 
                BeginTime="0:0:0"> 
           <Rotation3DAnimation.From> 
            <AxisAngleRotation3D Angle="0" Axis="0, 1, 0" /> 
           </Rotation3DAnimation.From> 
           <Rotation3DAnimation.To> 
            <AxisAngleRotation3D Angle="90" Axis="0, 1, 0" /> 
           </Rotation3DAnimation.To> 
          </Rotation3DAnimation> 
          <Rotation3DAnimation Storyboard.TargetName="v2dv3d" 
                Storyboard.TargetProperty="(Viewport2DVisual3D.Transform).(RotateTransform3D.Rotation)" 
                Duration="0:0:2" 
                BeginTime="0:0:2"> 
           <Rotation3DAnimation.From> 
            <AxisAngleRotation3D Angle="-90" Axis="0, 1, 0" /> 
           </Rotation3DAnimation.From> 
           <Rotation3DAnimation.To> 
            <AxisAngleRotation3D Angle="0" Axis="0, 1, 0" /> 
           </Rotation3DAnimation.To> 
          </Rotation3DAnimation> 
         </Storyboard> 
        </BeginStoryboard> 
       </EventTrigger> 
      </Button.Triggers> 
     </Button> 
    </Viewport2DVisual3D> 
    <ModelVisual3D> 
     <ModelVisual3D.Content> 
      <DirectionalLight Color="#FFFFFFFF" Direction="0,0,-1"/> 
     </ModelVisual3D.Content> 
    </ModelVisual3D> 
</Viewport3D> 
+0

謝謝您的回答。我不確切。我需要動畫這個過程。 – Yevgeniy

+0

@Eugene:用z軸動畫更新了我的答案。粘貼並嘗試:) –

+0

@Meleak這是一個Y軸旋轉。如果將軸更改爲Z,則還可以簡化故事板,因爲按鈕不會從相機中轉開。 – Kimberly

1

轉換可以幫助你在這種情況下。如果有幫助,請看here

RotateTransform類用於旋轉X-Y平面中的WPF對象。它可以通過XAML或通過命令式代碼直接應用。

1

如果您只需要旋轉關於Z軸的按鈕,那麼您將不需要任何3D圖形。所有的UIElements(例如按鈕)都有屬性RenderTransform,可以對其默認外觀進行基本轉換。通過Storyboards,WPF允許你animate almost any dependency property。您可以使用一個故事板,觸發負載,動畫應用到按鈕RotateTransform的Angle屬性:

<Button Width="100" Height="100" Content="Wheeee!"> 
    <Button.Triggers> 
    <EventTrigger RoutedEvent="FrameworkElement.Loaded"> 
     <BeginStoryboard> 
     <Storyboard Storyboard.TargetName="ButtonRotation" Storyboard.TargetProperty="Angle"> 
      <DoubleAnimation From="0" To="360" Duration="0:0:3" RepeatBehavior="Forever"/> 
     </Storyboard> 
     </BeginStoryboard> 
    </EventTrigger> 
    </Button.Triggers> 
    <Button.RenderTransform> 
    <RotateTransform x:Name="ButtonRotation" CenterX="50" CenterY="50" Angle="45"/> 
    </Button.RenderTransform> 
</Button> 

的Viewport2DVisual3D的建議,@Meleak,還支持動畫,是樂趣,如果玩你有時間。進行動畫顯示MSDN例如,需要一個名稱添加到AxisAngleRotation3D元件並切換到目標Z軸:

<AxisAngleRotation3D x:Name="RotateAboutZ" Angle="40" Axis="0, 0, 1" /> 

然後,如上所述,觸發一個情節串連圖板來開始對的Viewport3D的Loaded事件。在任何一種情況下,如果您需要對動畫進行更多控制,則可以使故事板成爲其他事件引用的命名資源,甚至可以完全用代碼構建和控制它。