之前已经解决了这个问题,但我无法让它正常工作......应该非常简单!
这是我的XAML:
<UserControl.Style>
<Style TargetType="UserControl">
<Style.Triggers>
<Trigger Property="Visibility" Value="Visible">
<Trigger.EnterActions>
<BeginStoryboard>
<Storyboard x:Name="FadeOutAnimation">
<DoubleAnimation Storyboard.TargetProperty="Opacity"
FillBehavior="Stop"
BeginTime="0:0:5" From="1.0" To="0.0"
Duration="0:0:1"/>
</Storyboard>
</BeginStoryboard>
</Trigger.EnterActions>
<Trigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<ObjectAnimationUsingKeyFrames
Storyboard.TargetProperty="Visibility"
BeginTime="0:0:7">
<DiscreteObjectKeyFrame>
<DiscreteObjectKeyFrame.Value>
<Visibility>Hidden</Visibility>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</Trigger.ExitActions>
</Trigger>
</Style.Triggers>
</Style>
</UserControl.Style>
这可以按预期工作:当控件的Visibility属性设置为Visible时,控件显示5秒钟,然后淡出1秒钟。然后控件的可见性在7秒后重置为隐藏(奇怪,但是6,淡入淡出动画的总时间,还不够 - 我想是另一个MS错误!)。
在随后的Button.Click事件中,Visibility属性显示为冻结或锁定为隐藏,并且无法再次变为可见!
任何想法为什么不呢?
答案 0 :(得分:1)
您的ExitActions Storyboard中的FillBehavior="Stop"
有帮助吗?
我认为这个故事板具有可见性值。
看看How to: Set a Property After Animating It with a Storyboard。
答案 1 :(得分:1)
由于动画范围内设置的属性无法跳过箍,如LPL发送链接所示(这真的有帮助!),我提出了一个代码,而不是XAML中的代码:
private void UserControl_IsVisibleChanged(object sender,
DependencyPropertyChangedEventArgs e)
{
if (this.Visibility == Visibility.Visible)
{
DoubleAnimation fadeIn = new DoubleAnimation();
fadeIn.From = 1d;
fadeIn.To = 1d;
fadeIn.Duration = new Duration(new TimeSpan(0, 0, 0));
DoubleAnimation fade = new DoubleAnimation();
fade.From = 1d;
fade.To = 0d;
fade.BeginTime = TimeSpan.FromSeconds(((MessageTextProperties)
DataContext).Duration);
fade.Duration = new Duration(new TimeSpan(0, 0, 1));
NameScope.SetNameScope(this, new NameScope());
this.RegisterName(this.Name, this);
Storyboard.SetTargetName(fadeIn, this.Name);
Storyboard.SetTargetProperty(fadeIn, new PropertyPath
(UIElement.OpacityProperty));
Storyboard.SetTargetName(fade, this.Name);
Storyboard.SetTargetProperty(fade, new PropertyPath
(UIElement.OpacityProperty));
Storyboard sb = new Storyboard();
sb.Children.Add(fadeIn);
sb.Children.Add(fade);
sb.Completed += new EventHandler(sb_Completed);
sb.Begin(this);
}
}
void sb_Completed(object sender, EventArgs e)
{
this.Visibility = Visibility.Hidden;
}
}
诀窍是sb_Completed。由于此是在正在运行的动画范围内,因此可以将“可见性”重置为“隐藏”。
答案 2 :(得分:1)
可能对你也有用
void UControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
if (this.Visibility == Visibility.Visible)
{
Storyboard sb = new Storyboard();
DoubleAnimation da = new DoubleAnimation();
da.From = 0;
da.To = 1;
da.Duration = new Duration(TimeSpan.FromSeconds(2));
sb.Children.Add(da);
Storyboard.SetTargetProperty(da, new PropertyPath(UserControl.OpacityProperty));
Storyboard.SetTarget(da, this);
sb.Completed += new EventHandler(sb_Completed);
sb.Begin();
}
if (this.Visibility == Visibility.Hidden || this.Visibility == Visibility.Collapsed)
{
Storyboard sb = new Storyboard();
DoubleAnimation da = new DoubleAnimation();
da.From = 1;
da.To = 0;
da.Duration = new Duration(TimeSpan.FromSeconds(2));
sb.Children.Add(da);
Storyboard.SetTargetProperty(da, new PropertyPath(UserControl.OpacityProperty));
Storyboard.SetTarget(da, this);
sb.Completed += new EventHandler(sb_Completed);
sb.Begin();
}
}
void sb_Completed(object sender, EventArgs e)
{
this.Visibility = Visibility.Visible;
}
答案 3 :(得分:1)