Как анимировать всплывающее окно, когда оно скрывается?

я создал Popup Style для использования в моем приложении Windows 8.1. И я применил PopupThemeTransition к его ChildTransitions свойству.

<Style x:Key="AnimatedPopupStyle" TargetType="Popup">
    <Setter Property="IsLightDismissEnabled" Value="False"/>
    <Setter Property="ChildTransitions">
        <Setter.Value>
            <TransitionCollection>
                <PopupThemeTransition/>
            </TransitionCollection>
        </Setter.Value>
    </Setter>
</Style>

Моя проблема в том, что он анимируется при открытии и не анимируется при закрытии. Что делать с этим для анимации содержимого при скрытии? Хочу ли я создать элемент управления Custom Popup?

Примечание: я знаю, что там PopInThemeAnimation и PopOutThemeAnimation . Но не знаете, как использовать его в этом состоянии?


person asitis    schedule 14.01.2014    source источник
comment
Что послужило причиной нежелания использовать тему?   -  person Jerry Nixon    schedule 17.01.2014
comment
@JerryNixon-MSFT извините, что вы имеете в виду?   -  person asitis    schedule 17.01.2014


Ответы (1)


Это не является родным для всплывающего окна, потому что они обычно не имеют анимации выхода. Сказав это, нет никаких причин, по которым вы не можете добавить анимацию выхода к элементу управления Popup.

Попробуй это:

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Grid.Resources>
        <Storyboard x:Name="ShowPopup">
            <PopInThemeAnimation Storyboard.TargetName="MyPopup" />
        </Storyboard>
        <Storyboard x:Name="HidePopup">
            <PopOutThemeAnimation Storyboard.TargetName="MyPopup" />
        </Storyboard>
    </Grid.Resources>
    <Popup x:Name="MyPopup" IsOpen="True"
           HorizontalAlignment="Center" VerticalAlignment="Center">
        <Popup.Transitions>
            <TransitionCollection>
                <PopupThemeTransition />
            </TransitionCollection>
        </Popup.Transitions>
        <Grid Height="200" Width="200" Background="Red">
            <StackPanel>
                <Button Content="Hide (Native)" HorizontalAlignment="Center">
                    <Interactivity:Interaction.Behaviors>
                        <Core:EventTriggerBehavior EventName="Click">
                            <Core:ChangePropertyAction 
                                PropertyName="IsOpen" 
                                TargetObject="{Binding ElementName=MyPopup}" />
                        </Core:EventTriggerBehavior>
                    </Interactivity:Interaction.Behaviors>
                </Button>
                <Button Content="Hide (Storyboard)" HorizontalAlignment="Center">
                    <Interactivity:Interaction.Behaviors>
                        <Core:EventTriggerBehavior EventName="Click">
                            <Media:ControlStoryboardAction 
                                Storyboard="{StaticResource HidePopup}"/>
                        </Core:EventTriggerBehavior>
                    </Interactivity:Interaction.Behaviors>
                </Button>
            </StackPanel>
        </Grid>
    </Popup>
    <StackPanel>
        <Button Content="Show Popup (Native)" HorizontalAlignment="Left" VerticalAlignment="Top">
            <Interactivity:Interaction.Behaviors>
                <Core:EventTriggerBehavior EventName="Click">
                    <Core:ChangePropertyAction 
                        TargetObject="{Binding ElementName=MyPopup}" 
                        PropertyName="IsOpen" Value="True"/>
                </Core:EventTriggerBehavior>
            </Interactivity:Interaction.Behaviors>
        </Button>
        <Button Content="Show Popup (Storyboard)" HorizontalAlignment="Left" VerticalAlignment="Top">
            <Interactivity:Interaction.Behaviors>
                <Core:EventTriggerBehavior EventName="Click">
                    <Core:ChangePropertyAction 
                        TargetObject="{Binding ElementName=MyPopup}" 
                        PropertyName="IsOpen" Value="True"/>
                    <Media:ControlStoryboardAction 
                        Storyboard="{StaticResource ShowPopup}"/>
                </Core:EventTriggerBehavior>
            </Interactivity:Interaction.Behaviors>
        </Button>
    </StackPanel>
</Grid>

Используя их:

xmlns:Interactivity="using:Microsoft.Xaml.Interactivity" 
xmlns:Core="using:Microsoft.Xaml.Interactions.Core"
xmlns:Media="using:Microsoft.Xaml.Interactions.Media"

Удачи!

person Jerry Nixon    schedule 14.01.2014
comment
если вы используете сторборды, чтобы показать/скрыть что-то, я бы посоветовал даже не использовать всплывающее окно. Просто используйте сетку, и тогда вам не нужно беспокоиться о свойстве IsOpen. - person Shawn Kendrot; 17.01.2014
comment
Дай мне подумать об этом, Шон. Двумя основными преимуществами всплывающего окна являются его способность внедряться в визуальное дерево и способность обрабатывать легкое закрытие. Поскольку он отключил отключение света, единственное, что еще осталось, это дерево. И насколько это тяжело? На самом деле, это не супер просто, но и не так уж сложно. Ваша рекомендация хороша, но, сказав это, что плохого? Это довольно легкий вес. - person Jerry Nixon; 17.01.2014
comment
Точно получить то, что я ищу. Спасибо и +1 за помощь. - person Raghav Narang; 05.12.2014