2011-08-23 6 views
5

Aiutami a plz. Ho bisogno di animare la rotazione del pulsante sull'asse z senza usare le librerie esterne, solo con C# e il codice xaml.Tasto rotante WPF

È possibile? Come lo posso fare?

Grazie.

risposta

11

Dai un'occhiata alla Viewport2DVisual3D

L'esempio nel collegamento fa esattamente questo.

Edit: Ecco l'esempio dal collegamento con un'animazione aggiunto del asse Z

assomiglia a questo
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

Grazie per la risposta. Non ero preciso Ho bisogno di animare questo processo. – Yevgeniy

+0

@Eugene: aggiornata la mia risposta con un'animazione sull'asse z. Incollalo e provalo :) –

+0

@Meleak Questa è una rotazione dell'asse Y. Se cambi l'asse in Z, puoi anche semplificare lo storyboard, perché il pulsante non si sposterà mai dalla fotocamera. – Kimberly

1

trasformazioni possono aiutare in questo caso. Guarda here se questo ti aiuta.

La classe RotateTransform viene utilizzata per ruotare un oggetto WPF in un piano X-Y . Può essere applicato tramite XAML o direttamente tramite codice imperativo.

1

Se è sufficiente ruotare il pulsante sull'asse Z, non è necessaria alcuna grafica 3D. Tutti gli elementi utente (come i pulsanti) hanno la proprietà RenderTransform, che consente la trasformazione di base del loro aspetto predefinito. Tramite Storyboards, WPF consente di animate almost any dependency property. È possibile utilizzare uno storyboard, innescato dal carico, ad animare la proprietà Angolo di un RotateTransform applicata al pulsante:

<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> 

Il Viewport2DVisual3D, come raccomandato da @Meleak, supporta anche l'animazione, ed è divertente da giocare con se hai tempo. Per animare l'esempio MSDN, è necessario aggiungere un nome all'elemento AxisAngleRotation3D e passare per indirizzare l'asse Z:

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

Poi, come sopra, innescare uno storyboard per iniziare l'evento Loaded del Viewport3D. In entrambi i casi, se hai bisogno di un maggiore controllo sull'animazione, puoi rendere lo storyboard una risorsa con nome a cui fare riferimento da altri eventi, o persino costruirlo e controllarlo interamente nel codice.