wpf - 使用 wpf VisualStateManager 动画可见性和不透明度

标签 wpf animation storyboard transition visualstatemanager

我正在尝试为控件设置动画,以便将其可见性设置为可见,然后将不透明度从 0 设置为 1

但是没有任何反应,1 秒后控件显示的不透明度为 1...我看不到我做错了什么

这是我尝试过的代码

<Grid x:Name="layout_root" Margin="10">
    <VisualStateManager.VisualStateGroups>
        <VisualStateGroup x:Name="Filtering">
            <VisualStateGroup.Transitions>
                <VisualTransition GeneratedDuration="0:0:1">
                    <VisualTransition.GeneratedEasingFunction>
                        <ElasticEase EasingMode="EaseInOut"/>
                    </VisualTransition.GeneratedEasingFunction>
                </VisualTransition>
            </VisualStateGroup.Transitions>

            <VisualState x:Name="Disabled"/>
            <VisualState x:Name="Enabled">
                <Storyboard>
                    <ObjectAnimationUsingKeyFrames BeginTime="0:0:0" Duration="0:0:0" Storyboard.TargetName="filter_control" Storyboard.TargetProperty="(UIElement.Visibility)">
                        <DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{x:Static Visibility.Visible}"/>
                    </ObjectAnimationUsingKeyFrames>
                    <DoubleAnimation Storyboard.TargetName="filter_control" Storyboard.TargetProperty="(UIElement.Opacity)" To="1"/>
                </Storyboard>
            </VisualState>
        </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>

    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition/>
    </Grid.RowDefinitions>

    <TextBox x:Name="filter_control" Margin="0,0,0,10" Text="Filtering" Visibility="Collapsed" Opacity="0"/>

    <ListView Grid.Row="1" ItemsSource="{Binding Posts}">
        <ListView.View>
            <GridView>
                <GridViewColumn Width="100" Header="Date" DisplayMemberBinding="{Binding Date, StringFormat={}{0:dd/MM/yyyy}}"/>
                <GridViewColumn Width="100" Header="Text" DisplayMemberBinding="{Binding Text}"/>
                <GridViewColumn Width="100" Header="Value" DisplayMemberBinding="{Binding Value, StringFormat=F2}"/>
            </GridView>
        </ListView.View>
    </ListView>

    <Button Grid.Row="1" Content="v" FontFamily="Marlett" FontSize="14" VerticalAlignment="Top" HorizontalAlignment="Left" Click="ShowFilterClick"/>
</Grid>

最佳答案

至于您做错了什么或为什么会看到您所看到的行为的问题:启用状态的 Storyboard是 VSM 在 VSGroup 处于该状态时使用的 Storyboard状态。不过,您可以为组指定一个转换 Storyboard,并且 VSM 在状态之间转换时应用该 Storyboard。因此,当您将 VSGroup 置于启用状态时,VSM 首先播放过渡 Storyboard ,然后使用您为启用状态指定的稳态 Storyboard 。过渡 Storyboard为 1 秒,这就是为什么您会看到 1 秒的延迟,然后突然出现。

类似下面的内容可能就是您想要的。请注意,过渡 Storyboard执行您想要的 Action /动画,而状态 Storyboard仅说明动画属性应保持的最终值。另外,我将缓动函数应用于双动画而不是整个 VisualTransition - 尝试使用缓动函数插入可见性是没有意义的。

<VisualStateGroup x:Name="Filtering">
    <VisualStateGroup.Transitions>
        <VisualTransition From="Disabled" To="Enabled" GeneratedDuration="0:0:1">
            <Storyboard>
               <ObjectAnimationUsingKeyFrames Duration="0:0:0" Storyboard.TargetName="filter_control" Storyboard.TargetProperty="(UIElement.Visibility)">
                   <DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{x:Static Visibility.Visible}"/>
               </ObjectAnimationUsingKeyFrames>
               <DoubleAnimation Duration="0:0:1" Storyboard.TargetName="filter_control" Storyboard.TargetProperty="(UIElement.Opacity)" To="1">
                  <DoubleAnimation.EasingFunction>
                     <ElasticEase EasingMode="EaseInOut"/>
                  </DoubleAnimation.EasingFunction>
               </DoubleAnimation>
           </Storyboard>
       </VisualTransition>
       <!-- you could also have a transition from Enabled to Disabled -->
    </VisualStateGroup.Transitions>

    <VisualState x:Name="Disabled">
            <Storyboard>
               <ObjectAnimationUsingKeyFrames Duration="0:0:0" Storyboard.TargetName="filter_control" Storyboard.TargetProperty="(UIElement.Visibility)">
                   <DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{x:Static Visibility.Collapsed}"/>
               </ObjectAnimationUsingKeyFrames>
               <DoubleAnimation Duration="0:0:0" Storyboard.TargetName="filter_control" Storyboard.TargetProperty="(UIElement.Opacity)" To="0"/>
           </Storyboard>
    </VisualState>
    <VisualState x:Name="Enabled">
            <Storyboard>
               <ObjectAnimationUsingKeyFrames Duration="0:0:0" Storyboard.TargetName="filter_control" Storyboard.TargetProperty="(UIElement.Visibility)">
                   <DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{x:Static Visibility.Visible}"/>
               </ObjectAnimationUsingKeyFrames>
               <DoubleAnimation Duration="0:0:0" Storyboard.TargetName="filter_control" Storyboard.TargetProperty="(UIElement.Opacity)" To="1"/>
           </Storyboard>
    </VisualState>
</VisualStateGroup>

关于wpf - 使用 wpf VisualStateManager 动画可见性和不透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12301479/

相关文章:

wpf - XAML - 绑定(bind)到 Path=TimeSpan.TotalMinutes

c# - 我可以扩展 Button 以添加 Right Click 事件,同时保持图形副作用吗?

html - 使图像忽略CSS中的动画

WPF - 无法停止动画 StoryBoard,IsControllable 不起作用?

objective-c - 通过 Storyboard场景的变化使标签内容持久化

objective-c - Push segue 在加载 View 之前短暂显示空白屏幕

c# - WPF 在代码中添加的行未显示 - 显示 XAML

c# - 如何像在关闭事件中那样从 wpf 窗口中删除焦点?

javascript - 使用 bool 值淡入动画更改背景颜色 View

ios - UITableView 行动画持续时间和完成回调