WPF задейства анимация при промяна на видимостта?

Ами аз имам персонализирана контрола и когато Visibility се промени на Visible имам Trigger с действие за влизане/излизане, но проблемът е, че когато се задейства действието за излизане, Visibility вече не е Visible, така че анимацията не може да се види как бих поправи това?

ето моето Trigger:

<ControlTemplate.Triggers>
    <Trigger Property="Visibility" Value="Visible">
        <Trigger.ExitActions>
            <BeginStoryboard Storyboard="{StaticResource Hide}"/>
        </Trigger.ExitActions>
        <Trigger.EnterActions>
            <BeginStoryboard Storyboard="{StaticResource Show}"/>
        </Trigger.EnterActions>
    </Trigger>
</ControlTemplate.Triggers>

person Peter    schedule 18.02.2010    source източник
comment
Това е вярно. Сложни неща. Бих решил този проблем с прикачени свойства + принуда на стойността. Погледнете тук: WPF Fade Animation. Надявам се това да помогне. Наздраве, Анвака.   -  person Anvaka    schedule 18.02.2010
comment
Това има ли избледняваща анимация? мога ли да редактирам това, така че само да забавя скриването/свиването, докато анимацията ми приключи?   -  person Peter    schedule 18.02.2010
comment
Чудя се същото като Петой.   -  person jpierson    schedule 22.07.2010
comment
@Petoj, @jpierson: Разбира се, можете да правите каквото искате с кода. Има вградена анимация и бих избрал предложения подход в моя пример. Тъй като чакането на външната анимация да завърши звучи като ненужна сложност. Въпреки че, ако наистина искате да го имате, можете да направите стойността на прикрепеното свойство по-сложна и да предадете анимация като една от неговите стойности... Чувствам, че е трудно да се даде пълно решение в този коментар. Ако имате нужда от повече, моля, публикувайте въпрос и аз ще дам по-подробен отговор :).   -  person Anvaka    schedule 22.07.2010


Отговори (3)


Опитах и ​​това и не успях. Мисля, че не е възможно да се постигне това в обикновен ControlTemplate с Trigger на свойството Visibility. Това, което можете да направите, е да добавите Opacity анимация от 1 до 0 към Trigger за различно свойство, например DependencyProperty, което добавяте в кода зад себе си.

person Dabblernl    schedule 18.02.2010

Можете също да използвате ObjectAnimationUsingKeyFrames, за да зададете Visibility за период на анимация. В такъв случай няма нужда от никакъв код отзад.

person user10341330    schedule 26.01.2011
comment
Не съм 100% сигурен, но няма ли HideStoryboard да задейства ShowStoryboard, ако промени стойността на Visibility? - person Peter; 27.01.2011

Има начин да го постигнете. Не е 100% чист, но работи за мен:

Не използвайте свойството Visibility, а използвайте свойството Opacity и Tag.

<ListView.Resources>
    <Style TargetType="{x:Type ListViewItem}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ListViewItem}">
                    <Border CornerRadius="5" 
                            BorderThickness="2" 
                            BorderBrush="DodgerBlue"
                            Background="#CC4f9dea" >
                        <Grid>
                            <ContentPresenter HorizontalAlignment="Stretch" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="Stretch" />
                            <Button x:Name="btnClose" Opacity="0" Content="X" Style="{StaticResource RoundedButtonStyle}"/>
                        </Grid>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="Tag" TargetName="btnClose" Value="Visible" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ListView.Resources>

<Style x:Key="RoundedButtonStyle" TargetType="{x:Type Button}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Border CornerRadius="15" Background="White" BorderThickness="1" Padding="2" BorderBrush="Black">
                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="Tag" Value="Visible">
            <Trigger.EnterActions>
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation Storyboard.TargetProperty="Opacity"
                         From="0.0" To="0.5" Duration="0:0:0.5"/>
                    </Storyboard>
                </BeginStoryboard>
            </Trigger.EnterActions>
            <Trigger.ExitActions>
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation Storyboard.TargetProperty="Opacity"
                         From="0.5" To="0.0" Duration="0:0:0.5"/>
                    </Storyboard>
                </BeginStoryboard>
            </Trigger.ExitActions>
        </Trigger>
    </Style.Triggers>
</Style>
person Gabriel    schedule 15.03.2018