WPF вращающаяся кнопка - PullRequest
       29

WPF вращающаяся кнопка

6 голосов
/ 24 августа 2011

Помогите мне, плз. Мне нужно анимировать вращение кнопки на оси z без использования внешних библиотек, только с кодом C # и xaml.

Это возможно? Как я могу это сделать?

Спасибо.

Ответы [ 3 ]

12 голосов
/ 24 августа 2011

Посмотрите на 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>
1 голос
/ 24 августа 2011

Если вам нужно только повернуть кнопку вокруг оси Z, 3D-графика вам не понадобится. Все элементы UIE (такие как кнопки) имеют свойство RenderTransform , которое обеспечивает базовое преобразование их внешнего вида по умолчанию. С помощью Раскадровки WPF позволяет анимировать практически любое свойство зависимости . Вы можете использовать раскадровку, запускаемую при загрузке, чтобы анимировать свойство Angle объекта RotateTransform, примененного к кнопке:

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

Затем, как указано выше, запустить раскадровку для события Loaded в Viewport3D. В любом случае, если вам нужен больший контроль над анимацией, вы можете сделать вашу раскадровку именованным ресурсом, на который будут ссылаться другие события, или даже создать и полностью контролировать его в коде.

1 голос
/ 24 августа 2011

Преобразования могут помочь вам в этом случае. Посмотрите на здесь , если это поможет.

Класс RotateTransform используется для поворота объекта WPF в X-Y самолет. Может применяться через XAML или напрямую через императивный код.

...