WPF – невозможно заставить раскадровку повлиять на другой локальный ресурс

StackOverflow https://stackoverflow.com/questions/1833208

  •  11-09-2019
  •  | 
  •  

Вопрос

Я настроил Трансформацию и Раскадровку как локальные ресурсы, но когда я запускаю раскадровку с помощью кнопки, я получаю следующую ошибку:

{"Имя «WorldTranslation» не может быть найдено в области имен «System.Windows.Controls.Button»."}

Может кто-нибудь указать мне в правильном направлении, пожалуйста?

<Window.Resources>

    <Transform3DGroup x:Key="WorldTranslation">
        <RotateTransform3D>
            <RotateTransform3D.Rotation>
                <AxisAngleRotation3D x:Name="myAngleRotation" Axis="0,1,0" Angle="0" />
            </RotateTransform3D.Rotation>
        </RotateTransform3D>
    </Transform3DGroup>

    <Storyboard x:Key="MyStoryboard">
        <DoubleAnimation
            Storyboard.TargetName="WorldTranslation"
        Storyboard.TargetProperty="(Transform3DGroup).(RotateTransform3D).(RotateTransform3D.Rotation).(AxisAngleRotation3D.Angle)"
        From="0"
        To="360"
        Duration="0:0:1"   
       />
    </Storyboard>

</Window.Resources>

А вот кнопка xaml...

<Button Height="20" Width="100">
   <Button.Content>Blah</Button.Content>
       <Button.Triggers>
          <EventTrigger RoutedEvent="Button.Click">
               <EventTrigger.Actions>
                   <BeginStoryboard Storyboard="{StaticResource MyStoryboard}" >

                    </BeginStoryboard>
                </EventTrigger.Actions>
          </EventTrigger>
       </Button.Triggers>
  </Button>
Это было полезно?

Решение

В вашем XAML есть несколько ошибок.Я начну со встроенного преобразования, а затем реорганизую его в ресурсы.Я перешел на 2D RotateTransform, чтобы не усложнять ситуацию без необходимости.

Начнем с:

       <Button Height="20" Width="100"
            RenderTransformOrigin=".5,.5"
            Content="Blah">
        <Button.RenderTransform>
            <RotateTransform Angle="0" x:Name="MyAnimatedTransform"/>
        </Button.RenderTransform>
        <Button.Triggers>
            <EventTrigger RoutedEvent="Button.Click">
                <EventTrigger.Actions>
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation
                              Storyboard.TargetName="MyAnimatedTransform"
                              Storyboard.TargetProperty="(RotateTransform.Angle)"
                              From="0.0" To="360" Duration="0:0:1" />
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger.Actions>
            </EventTrigger>
        </Button.Triggers>
    </Button>

Затем достаем StoryBoard:

<Window.Resources>
    <Storyboard x:Key="MyStoryBoard">
        <DoubleAnimation
           Storyboard.TargetName="MyAnimatedTransform"
           Storyboard.TargetProperty="(RotateTransform.Angle)"
           From="0.0" To="360" Duration="0:0:.3" />
    </Storyboard>
</Window.Resources>
<Grid>
    <Button Height="20" Width="100"
            RenderTransformOrigin=".5,.5"
            Content="Blah">
        <Button.RenderTransform>
            <RotateTransform Angle="0" x:Name="MyAnimatedTransform"/>
        </Button.RenderTransform>
        <Button.Triggers>
            <EventTrigger RoutedEvent="Button.Click">
                <EventTrigger.Actions>
                    <BeginStoryboard Storyboard="{StaticResource MyStoryBoard}"/>
                </EventTrigger.Actions>
            </EventTrigger>
        </Button.Triggers>
    </Button>
</Grid>

И, наконец, RotateTransform.Ссылка на это с помощью свойства Storyboard.TargetName здесь не работает.Вам нужно свойство Storyboard.Target:

<Window.Resources>
    <RotateTransform Angle="0" x:Key="WorldTransform"/>
    <Storyboard x:Key="MyStoryBoard">
        <DoubleAnimation
           Storyboard.Target="{Binding TemplatedParent}"
           Storyboard.TargetProperty="(UIElement.RenderTransform).(RotateTransform.Angle)"
           From="0.0" To="360" Duration="0:0:.3" />
    </Storyboard>
</Window.Resources>
<Grid>
    <Button Height="20" Width="100"
            RenderTransformOrigin=".5,.5"
            Content="Blah">
        <Button.RenderTransform>
            <StaticResource ResourceKey="WorldTransform" />
        </Button.RenderTransform>
        <Button.Triggers>
            <EventTrigger RoutedEvent="Button.Click">
                <EventTrigger.Actions>
                    <BeginStoryboard Storyboard="{StaticResource MyStoryBoard}"/>
                </EventTrigger.Actions>
            </EventTrigger>
        </Button.Triggers>
    </Button>
</Grid>

РЕДАКТИРОВАТЬ:Из-за бонусного вопроса ;-) Предположим, что вы хотите, чтобы преобразование произошло в сетке.Просто перехватите событие Button.Click в сетке (события маршрутизируются, помните?) и поместите туда триггер.TemplatedParent теперь будет сеткой, а не кнопкой.

 <Grid RenderTransformOrigin=".5,.5">
    <Grid.RenderTransform>
        <StaticResource ResourceKey="WorldTransform"/>
    </Grid.RenderTransform>
    <Grid.Triggers>
        <EventTrigger RoutedEvent="Button.Click">
            <EventTrigger.Actions>
                <BeginStoryboard Storyboard="{StaticResource MyStoryBoard}"/>
            </EventTrigger.Actions>
        </EventTrigger>
    </Grid.Triggers>
    <Button Height="20" Width="100"
            Content="Blah">
    </Button>
</Grid>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top