[英]WPF property trigger with enumeration
我有带用户控件的WPF C#应用程序,我想在3个状态之间进行动画处理。
用户控件:
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,在其中定义了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实现的bool属性,但是这里有3个示例,它们可能有所不同。
有什么好方法可以使这项工作吗?
谢谢
我已经可以通过动画解决方案修复它,使其不能与数据触发器正确配合使用
这个想法是在EnterActions中定义Storyboard,并在 BeginStoryboard 之前确保所有其他Storyboard被删除。
固定代码是这样的:(请注意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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.