Как сделать анимацию XAML, чтобы элемент исчез после того, как он исчез

Благодаря ответу на этот вопрос о переполнении стека. Мне удалось заставить работать следующую анимацию, так что когда значение моего свойства ViewModel PageToolBarVisible вызывает постепенное появление и исчезновение панели инструментов.

Проблема в:

  • непрозрачность панели инструментов исчезает, но пространство, которое она занимала, все еще присутствует после ее исчезновения
  • начальный статус панели инструментов не синхронизирован со значением свойства ViewModel

Но как мне обрабатывать следующие условия в самом XAML, если это возможно:

  • после панель инструментов (Граница) исчезает, как мне сказать "тогда и только тогда видимость=свернуто" (возможно, две анимации происходят одновременно или цепочка анимаций так видна =collapsed происходит после первой анимации), редактировать: я добавил триггер Opacity=0 ниже, который прекрасно работает
  • до панель инструментов исчезает, как сказать "Visibilty=Normal"
  • как мне также привязать эти события не только к процессу View Load, чтобы они отображали правильный статус (затухание или исчезновение) при первом появлении страницы?

Вот моя анимация на данный момент:

    <Style x:Key="PageToolBarStyle" TargetType="Border">
        <Style.Triggers>
            <DataTrigger Binding="{Binding PageToolBarVisible}" Value="true">

                <DataTrigger.EnterActions>
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation
                                Storyboard.TargetProperty="Opacity"
                                From="0.0" 
                                To="1.0" 
                                Duration="0:0:2"/>
                        </Storyboard>
                    </BeginStoryboard>
                </DataTrigger.EnterActions>

                <DataTrigger.ExitActions>
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation
                                Storyboard.TargetProperty="Opacity"
                                From="1.0" 
                                To="0.0" 
                                Duration="0:0:2"/>
                        </Storyboard>
                    </BeginStoryboard>
                </DataTrigger.ExitActions>

            </DataTrigger>

            <Trigger Property="Opacity" Value="0">
                <Setter Property="Visibility" Value="Collapsed"/>
            </Trigger>

        </Style.Triggers>
    </Style>

<Window.Triggers>
    <EventTrigger RoutedEvent="FrameworkElement.Loaded">
        <EventTrigger.Actions>
            ...how can I tell it here to "do the trigger logic contained in "PageToolBarStyle"...
        </EventTrigger.Actions>
    </EventTrigger>
</Window.Triggers>

person Edward Tanguay    schedule 07.07.2009    source источник


Ответы (1)


Вы можете создать триггер для непрозрачности рассматриваемого элемента. Как только это значение равно "0", вы можете установить видимость элемента. Это должно обрабатывать как первый, так и второй пункт сверху.

Что касается третьего пункта... если я вас правильно понял, то есть событие FrameworkElement.Loaded, которое можно использовать для решения проблемы запуска анимации при первой загрузке View.

person Chris Nicol    schedule 07.07.2009
comment
FraneworkElement.Loaded должен быть частью Window.Triggers. Что касается триггера непрозрачности, я не уверен, почему он не работает. Альтернативой является добавление метода к завершенному событию, чтобы установить видимость в коде программной части (но я понимаю, что вы хотите сохранить его в XAML) - person Chris Nicol; 07.07.2009
comment
Я добавил оба предложения, первое (trigger opacity=0) отлично работает, но второе (frameworkelement.loaded) вызывает ошибку, куда именно нужно перейти? - person Edward Tanguay; 07.07.2009
comment
Хорошо, я поместил ‹EventTrigger RoutedEvent=FrameworkElement.Loaded› в Windows.Triggers, как показано выше, но как мне тогда сказать ему выполнять логику триггера, содержащуюся в PageToolBarStyle в этот момент? - person Edward Tanguay; 07.07.2009
comment
Если вы создаете свою раскадровку как ресурс... тогда вы можете просто вызвать ресурс. ‹EventTrigger.Actions› ‹BeginStoryboard Storyboard={StaticResource NamedStoryboardResource} /› ‹/EventTrigger.Actions› - person Chris Nicol; 07.07.2009
comment
Но я не хочу вызывать StoryBoard FadeIn или StoryBoard FadeOut, я хочу вызвать СТИЛЬ, чтобы он выполнял эту логику ‹DataTrigger Binding={Binding PageToolBarVisible} Value=true›, а затем САМ соответствующим образом выбирает, какой StoryBoard выполнять ( свойство ViewModel может быть истинным или ложным при запуске). - person Edward Tanguay; 07.07.2009
comment
Я задал этот вопрос более кратко здесь: stackoverflow.com/questions/1092330/ - person Edward Tanguay; 07.07.2009