2012-09-06 36 views
2

我想,这样它的可见性设置为可见,然后动画从0不透明度为1动画效果的可视性和透明度与WPF VisualStateManager

但是什么也没有发生动画控制按钮,然后在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> 

回答

3

至于你做错了,或者为什么你看,你看到的行为是什么问题:为使能状态的故事板是,VSM使用而VSGroup是这种状态故事板。但是,您为该组指定了一个过渡故事板,并且VSM适用于在状态之间转换时。因此,当您将VSGroup置于启用状态时,VSM首先播放转场故事板,然后使用您为启用状态指定的稳态故事板。过渡故事板是1秒,这就是为什么你看到1秒的延迟,然后流行。

下面的东西可能是你想要的东西。请注意,过渡故事板会执行所需的动作/动画,而状态故事板只是说明应该保留动画属性的最终值。另外,我将缓动函数应用于双动画而不是整个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> 
+0

我已经标记为你接受的答案(因为它的工作原理:-))......但似乎在这种情况下,各州自己是多余的?我认为这就是我抛弃课程 – lycilph

+0

这些州是必需的。否则你无法告诉vsm做什么。至于各州的故事板,残疾人当然是需要的,因此它的视觉状态可以回溯到(否则,没有关于视觉状态是什么的声明)。你有没有在启用状态下的故事板试过吗? – dtm

+0

是的,它的工作原理。在这种情况下,我似乎可以只使用2个空状态,并在转换中完成所有动画(往返于“已启用”状态) – lycilph

1

能见度枚举不是一种固有的动画属性的代码。通常只有数字属性才是真正的动画,因为WPF可以填充关键帧之间的空间。例如,它知道0和1之间的不透明度为0.5。它知道基于当前时间的每个可能的值。

如果您在1秒内从Visibility.Collapsed变为Visibility.Visible进行动画制作,它不知道在0.5秒标记或其他任何点之间应该做什么。它只知道你正在将枚举值从1改为另一值。如果你的过渡时间是1秒,它会等到第二秒到来,然后改变这个值,所以你永远不会看到不透明的动画发生。

您可以尝试使用FluidLayout。您可以像这样启用它:

<VisualStateGroup x:Name="Filtering" ei:ExtendedVisualStateManager.UseFluidLayout="True"> 

您还可以在Blend UI中使用切换启用它。

FluidLayout为您动画布局更改。折叠或展开元素会影响布局,因此它可以自动为这些布局更改设置动画效果。