WPF VisualStateManager Связывание анимации - PullRequest
2 голосов
/ 24 января 2011

Я использую простую DoubleAnimation в Button.Trigger. Анимация От привязана к корневому элементу ActualHeight. Это работает как ожидалось.

Далее я попытался переместить раскадровку в VisualStateManager. Сейчас WPF жалуется:

System.Windows.Data Ошибка: 2: не удается найти управляющий FrameworkElement или FrameworkContentElement для целевого элемента. BindingExpression: Path = ActualWidth; DataItem = NULL; целевой элемент - DoubleAnimation (HashCode = 29201322); целевое свойство 'To' (введите 'Nullable`1')

Разве невозможно использовать привязки в анимациях в VisualStateManager.VisualStateGroups / VisualState?

Кажется, нет. Я исправил проблему, переместив раскадровку на ресурсы. Так что теперь GameToTitle будет работать, а TitleToGame не удастся.

Я бы все равно хотел узнать, ожидается ли это или нет.

Соответствующий XAML:

<Grid x:Name="MainInterface">
    <Grid.Resources>
        <Storyboard x:Key="GameToTitle">
            <DoubleAnimation Storyboard.TargetName="GameScreenInterface" Storyboard.TargetProperty="(Control.RenderTransform).(TransformGroup.Children)[1].(TranslateTransform.Y)" From="0" To="{Binding Path=ActualHeight, ElementName=MainInterface}" Duration="0:0:0.2"/>
            <DoubleAnimation Storyboard.TargetName="TitleScreenInterface" Storyboard.TargetProperty="(Control.RenderTransform).(TransformGroup.Children)[1].(TranslateTransform.Y)" From="{Binding Path=ActualHeight, ElementName=MainInterface, Converter={Converters:InverseConverter}}" To="0" Duration="0:0:0.2"/>
        </Storyboard>
    </Grid.Resources>
    <VisualStateManager.VisualStateGroups>
        <VisualStateGroup>
            <VisualState x:Name="TitleScreenState" Storyboard="{StaticResource ResourceKey=GameToTitle}"/>
            <VisualState x:Name="GameScreenState">
                <Storyboard>
                    <DoubleAnimation Storyboard.TargetName="GameScreenInterface" Storyboard.TargetProperty="(Control.RenderTransform).(TransformGroup.Children)[1].(TranslateTransform.Y)" From="{Binding Path=ActualHeight, ElementName=MainInterface}" To="0" Duration="0:0:0.2"/>
                        <DoubleAnimation Storyboard.TargetName="TitleScreenInterface" Storyboard.TargetProperty="(Control.RenderTransform).(TransformGroup.Children)[1].(TranslateTransform.Y)" From="0" To="{Binding Path=ActualHeight, ElementName=MainInterface, Converter={Converters:InverseConverter}}" Duration="0:0:0.2"/>
                </Storyboard>
            </VisualState>
        </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>
    <View:TitleScreen x:Name="TitleScreenInterface"/>
    <View:GameScreen x:Name="GameScreenInterface" />
</Grid>

1 Ответ

3 голосов
/ 13 декабря 2012

Как отмечается в комментариях к вопросу, раскадровки, содержащие привязки, должны быть объявлены как ресурсы, а не как встроенные в VisualStateGroup, чтобы привязки работали.Это связано с тем, что VisualStates не являются частью VisualTree.Ресурсы, с другой стороны,:

Вы можете визуализировать это для себя, используя Snoop (или аналогичную утилиту), чтобы посмотреть на визуальное дерево вашего приложения.Вы заметите, что узлы ресурсов появляются в визуальном дереве внутри Snoop, а визуальные состояния - нет.

Storyboards appearing in the visual tree.

...