2017-04-11 135 views
1

我正在创建一个包含动画的样式,它可以被继承到自动应用的特定控件样式。c#wpf在可见性触发器中设置动画不透明度

其实我挣扎在实现一个简单的动画:

  • Visibility更改为VisibleOpacity从0改为1
  • Visibility变更为比visible别的东西,Opacity是做相反的事情

到目前为止我得到了:

<Style x:Key="BaseAnimationsStyle"> 
    <Style.Triggers> 
     <Trigger Property="FrameworkElement.Visibility" Value="Visible"> 
      <Trigger.EnterActions> <!-- this works --> 
       <BeginStoryboard> 
        <Storyboard> 
         <DoubleAnimation Storyboard.TargetProperty="Opacity" To="1" Duration="0:0:0.5" /> 
        </Storyboard> 
       </BeginStoryboard> 
      </Trigger.EnterActions> 
      <Trigger.ExitActions><!-- this doesn't --> 
       <BeginStoryboard> 
        <Storyboard> 
         <DoubleAnimation Storyboard.TargetProperty="Opacity" To="0" Duration="0:0:0.5" /> 
        </Storyboard> 
       </BeginStoryboard> 
      </Trigger.ExitActions> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

如果上述样式设置在控制然后它具有以下特性:

当控制的Visibility设置为Visible过渡工作正常,这意味着它在被衰落

问题: 当控件的Visibility设置为Hidden(或甚至Collapsed)时,控件将立即隐藏而不会消失。

我的猜测是,有一些默认行为可以替代FrameworkElement处理可见性更改。

+1

能否请你澄清你的问题?隐藏时你看到控制吗? – mm8

+0

@ mm8我猜你现在可能看得很清楚:) – LuckyLikey

+1

这是因为在元素可见性设置为折叠或隐藏之后 - 在它上面设置不透明度(或其他任何东西)的动画效果没有意义 - 现在,好了,不再可见:) – Evk

回答

1

设置Visibility属性为CollapsedHidden会使元素无形马上,而是设置Visibility属性,你可以设置你的一些附加属性,然后动画Opacity财产淡出元素。请参阅以下链接了解更多信息和示例。

WPF:如何动画visibility属性?:http://blogs.microsoft.co.il/arik/2010/02/08/wpf-how-to-animate-visibility-property/

WPF Fade Animation

+1

Heeman ..这些都是很好的建议,我会尝试这个,并给你适当的反馈。 – LuckyLikey

0

我已经解决了我的问题与@ MM8的答案提供的信息。

基本上我加了VisibilityAnimation类到我的项目。然后,我使用Setter中的提供的附加属性简单地创建了我的基础样式。

<!-- Animations --> 
<Style x:Key="BaseAnimationsStyle"> 
    <Setter Property="anim:VisibilityAnimation.AnimationType" Value="Fade" /> 
</Style> 


<!-- This adds the Visibility Animation to every Grid which has access to this resource --> 
<Style TargetType="{x:Type Grid}" BasedOn="{StaticResource BaseAnimationsStyle}" /> 
0

另一种解决方案:

的可视性创建AttachedProperties。这使您可以设置任何控件的可见性,而不会自动设置不透明度。

如果要在属性上使用绑定,则绑定的第一次评估将导致动画(如果该值不是Visibility.Visible)。这就是为什么需要另一个属性来指定另一个可见性来启动。现在

public static class AnimateableVisibility 
{ 
    public static readonly DependencyProperty VisibilityProperty = DependencyProperty.RegisterAttached(
     "Visibility", typeof(Visibility), typeof(AnimateableVisibility), new PropertyMetadata(default(Visibility), VisibilityPropertyChanged)); 

    private static void VisibilityPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var val = (Visibility) e.NewValue; 
     // Set StartVisibility to Visible when Visibility is set to Visible 
     if (val == Visibility.Visible) 
      d.SetCurrentValue(StartVisibilityProperty, val); 
    } 


    public static readonly DependencyProperty StartVisibilityProperty = DependencyProperty.RegisterAttached(
     "StartVisibility", typeof(Visibility), typeof(AnimateableVisibility), new PropertyMetadata(default(Visibility))); 

    public static Visibility GetVisibility(DependencyObject obj) 
    { 
     return (Visibility)obj.GetValue(VisibilityProperty); 
    } 

    public static void SetVisibility(DependencyObject obj, Visibility value) 
    { 
     obj.SetValue(VisibilityProperty, value); 
    } 


    public static Visibility GetStartVisibility(DependencyObject obj) 
    { 
     return (Visibility)obj.GetValue(VisibilityProperty); 
    } 

    public static void SetStartVisibility(DependencyObject obj, Visibility value) 
    { 
     obj.SetValue(VisibilityProperty, value); 
    } 
} 

,你可以按如下方式使用这些属性:

<Grid> 
    <StackPanel VerticalAlignment="Center" HorizontalAlignment="Center" Orientation="Horizontal"> 
     <Button Margin="5,0,15,0" Padding="7,0" Style="{StaticResource VisibilityAnimation}" utils:AnimateableVisibility.StartVisibility="Hidden" 
      utils:AnimateableVisibility.Visibility="{Binding ElementName=CheckBox, Path=IsChecked, Converter={StaticResource BoolToVisibilityConverter}}">I'm a Button</Button> 
     <CheckBox VerticalAlignment="Center" IsChecked="False" x:Name="CheckBox"></CheckBox> 
    </StackPanel> 
</Grid> 

通过改变StartVisibilityVisible,你可以看到Button如何淡出的启动。

所有这就是现在缺少的是应用的样式:

<Style x:Key="VisibilityAnimation"> 
    <Style.Triggers> 
     <Trigger Property="utils:AnimateableVisibility.StartVisibility" Value="Hidden"> 
      <!-- This avoids the Animation in cases when the first evaluation of AnimateableVisibility.Visibility is false --> 
      <Setter Property="UIElement.Visibility" Value="Hidden" /> 
     </Trigger> 
     <Trigger Property="utils:AnimateableVisibility.Visibility" Value="Visible"> 
      <Trigger.EnterActions> 
       <BeginStoryboard> 
        <Storyboard TargetProperty="Opacity"> 
         <DoubleAnimation To="1" Duration="0:0:2"/> 
        </Storyboard> 
       </BeginStoryboard> 
      </Trigger.EnterActions> 
      <Trigger.ExitActions> 
       <BeginStoryboard> 
        <Storyboard TargetProperty="Opacity"> 
         <DoubleAnimation To="0" Duration="0:0:2"/> 
        </Storyboard> 
       </BeginStoryboard> 
      </Trigger.ExitActions> 
     </Trigger> 
    </Style.Triggers> 
</Style>