我有以下的XAML代码,希望将其转换为后台代码。我已经成功地创建了动画效果,以便控件按预期淡入和淡出,但我在将IsMouseOver触发器转换为后台代码时遇到了问题:
<DataTemplate.Triggers>
<EventTrigger RoutedEvent="Control.Loaded"
SourceName="NotificationGrid">
<BeginStoryboard x:Name="BeginNotificationStoryboard">
<Storyboard x:Name="NotificationStoryboard">
<DoubleAnimation Storyboard.TargetName="NotificationGrid"
From="0.01"
To="1"
Storyboard.TargetProperty="Opacity"
Duration="0:0:0.5" />
<DoubleAnimation Storyboard.TargetName="NotificationGrid"
From="1"
To="0"
Storyboard.TargetProperty="Opacity"
Duration="0:0:0.5"
BeginTime="0:0:5" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<Trigger Property="IsMouseOver"
Value="True">
<Trigger.EnterActions>
<SeekStoryboard Offset="0:0:3"
BeginStoryboardName="BeginNotificationStoryboard" />
<PauseStoryboard BeginStoryboardName="BeginNotificationStoryboard" />
</Trigger.EnterActions>
<Trigger.ExitActions>
<SeekStoryboard Offset="0:0:3"
BeginStoryboardName="BeginNotificationStoryboard" />
<ResumeStoryboard BeginStoryboardName="BeginNotificationStoryboard" />
</Trigger.ExitActions>
</Trigger>
</DataTemplate.Triggers>
</DataTemplate>
我遇到的问题是,我如何知道SeekStoryboard类实例的'BeginStoryboardName'值应该是什么,因为我没有必要创建一个BeginStoryboard实例来使加载时的动画按预期工作。
var loadingAnimation = new DoubleAnimation(0.01, 1, new Duration(TimeSpan.FromSeconds(0.5)));
var closingAnimation = new DoubleAnimation(1, 0, new Duration(TimeSpan.FromSeconds(3)))
{
BeginTime = TimeSpan.FromSeconds(5)
};
Storyboard.SetTarget(loadingAnimation, AssociatedObject);
Storyboard.SetTarget(closingAnimation, AssociatedObject);
Storyboard.SetTargetProperty(loadingAnimation, new PropertyPath(UIElement.OpacityProperty));
Storyboard.SetTargetProperty(closingAnimation, new PropertyPath(UIElement.OpacityProperty));
Storyboard.SetTarget(loadingAnimation, AssociatedObject);
Storyboard.SetTarget(closingAnimation, AssociatedObject);
var storyboard = new Storyboard();
storyboard.Children.Add(loadingAnimation);
storyboard.Children.Add(closingAnimation);
var enterSeekStoryboard = new SeekStoryboard
{
Offset = TimeSpan.FromSeconds(5),
// What value should go here?
BeginStoryboardName = ""
};
var exitSeekStoryboard = new SeekStoryboard
{
Offset = TimeSpan.FromSeconds(5),
// What value should go here?
BeginStoryboardName = ""
};
var trigger = new Trigger
{
Property = UIElement.IsMouseOverProperty,
Value = true
};
trigger.EnterActions.Add(enterSeekStoryboard);
trigger.ExitActions.Add(exitSeekStoryboard);
var style = new Style();
style.Triggers.Add(trigger);
AssociatedObject.Style = style;
storyboard.Completed += HandleOnCompleted;
storyboard.Begin();