2013-05-02 111 views
0

我有WPF C#应用程序与用户控件我想在3个状态之间动画。WPF属性触发器与枚举

用户控制:

public partial class Cart : UserControl 
{ 
    /// <summary> 
    /// The <see cref="Layout" /> dependency property's name. 
    /// </summary> 
    public const string LayoutPropertyName = "Layout"; 

    /// <summary> 
    /// Gets or sets the value of the <see cref="Layout" /> 
    /// property. This is a dependency property. 
    /// </summary> 
    public Visibility Layout 
    { 
     get 
     { 
      return (Visibility)GetValue(LayoutProperty); 
     } 
     set 
     { 
      SetValue(LayoutProperty, value); 
     } 
    } 

    public static readonly DependencyProperty LayoutProperty = DependencyProperty.Register(
     LayoutPropertyName, 
     typeof(Visibility), 
     typeof(Carrito), 
     new PropertyMetadata(Visibility.Hidden)); 
} 

另外,我有一个Styles.xaml其中I定义3个故事板我打算重复使用属性触发定位在不同的位置的控制。

<Storyboard x:Key="CartVisible"> 
    <ThicknessAnimation Storyboard.TargetProperty="Margin" Duration="0:0:0.5" To="0,648,0,0" /> 
</Storyboard> 
<Storyboard x:Key="CartCollapsed"> 
    <ThicknessAnimation Storyboard.TargetProperty="Margin" Duration="0:0:0.5" To="0,736,0,0" /> 
</Storyboard> 
<Storyboard x:Key="CartHidden"> 
    <ThicknessAnimation Storyboard.TargetProperty="Margin" Duration="0:0:0.5" To="0,768,0,0" /> 
</Storyboard> 
<Style TargetType="c:Cart" TargetType="FrameworkElement"> 
    <Setter Property="Margin" Value="0,768,0,0" /> 
    <Style.Triggers> 
     <Trigger Property="Layout" Value="Visible"> 
      <Trigger.EnterActions> 
       <BeginStoryboard Storyboard="{StaticResource CartVisible}" /> 
      </Trigger.EnterActions> 
      <Trigger.ExitActions> 
       <BeginStoryboard Storyboard="{StaticResource CartHidden}" /> 
      </Trigger.ExitActions> 
     </Trigger> 
     <Trigger Property="Layout" Value="Collapsed"> 
      <Trigger.EnterActions> 
       <BeginStoryboard Storyboard="{StaticResource CartCollapsed}" /> 
      </Trigger.EnterActions> 
      <Trigger.ExitActions> 
       <BeginStoryboard Storyboard="{StaticResource CartVisible}" /> 
      </Trigger.ExitActions> 
     </Trigger> 
     <Trigger Property="Layout" Value="Hidden"> 
      <Trigger.EnterActions> 
       <BeginStoryboard Storyboard="{StaticResource CartHidden}" /> 
      </Trigger.EnterActions> 
      <Trigger.ExitActions> 
       <BeginStoryboard Storyboard="{StaticResource CartVisible}" /> 
      </Trigger.ExitActions> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

然后,我有一个xaml绑定到属性Layout,它触发属性值的更改。

问题是动画并不总是适用于每个状态更改。我见过的所有例子都是使用Enter和ExitActions的布尔属性,但在这里我有3个可能不同的例子。

有没有一个很好的方法来完成这项工作?

感谢

回答

0

我已经能够使用该解决方案修复它为Animation not working correctly with data triggers

的想法是在EnterActions定义故事板,并的BeginStoryboard,确保每一个其他故事板除去。

固定代码是这样的:(请注意s:S.Cart ......它们是在另一个类中保存的常量)。

<Style TargetType="c:Cart"> 
    <Setter Property="Margin" Value="{x:Static s:S+Cart.Hidden}" /> 
    <Style.Triggers> 
     <Trigger Property="Layout" Value="Visible"> 
      <Trigger.EnterActions> 
       <RemoveStoryboard BeginStoryboardName="CartCollapsed" /> 
       <RemoveStoryboard BeginStoryboardName="CartHidden" /> 
       <BeginStoryboard Name="CartVisible"> 
        <Storyboard> 
         <ThicknessAnimation Storyboard.TargetProperty="Margin" 
            Duration="0:0:0.5" 
            To="{x:Static s:S+Cart.Visible}" /> 
        </Storyboard> 
       </BeginStoryboard> 
      </Trigger.EnterActions> 
     </Trigger> 
     <Trigger Property="Layout" Value="Collapsed"> 
      <Trigger.EnterActions> 
       <RemoveStoryboard BeginStoryboardName="CartVisible" /> 
       <RemoveStoryboard BeginStoryboardName="CartHidden" /> 
       <BeginStoryboard Name="CartCollapsed"> 
        <Storyboard> 
         <ThicknessAnimation Storyboard.TargetProperty="Margin" 
            Duration="0:0:0.5" 
            To="{x:Static s:S+Cart.Collapsed}" /> 
        </Storyboard> 
       </BeginStoryboard> 
      </Trigger.EnterActions> 
     </Trigger> 
     <Trigger Property="Layout" Value="Hidden"> 
      <Trigger.EnterActions> 
       <RemoveStoryboard BeginStoryboardName="CartVisible" /> 
       <RemoveStoryboard BeginStoryboardName="CartCollapsed" /> 
       <BeginStoryboard Name="CartHidden"> 
        <Storyboard> 
         <ThicknessAnimation Storyboard.TargetProperty="Margin" 
            Duration="0:0:0.5" 
            To="{x:Static s:S+Cart.Hidden}" /> 
        </Storyboard> 
       </BeginStoryboard> 
      </Trigger.EnterActions> 
     </Trigger> 
    </Style.Triggers>