支持动画使用不同的形状

This commit is contained in:
艾竹
2023-05-01 00:10:55 +08:00
parent 4a3f278a97
commit 48555edbc6
13 changed files with 183 additions and 29 deletions

View File

@@ -42,7 +42,7 @@ namespace AIStudio.Wpf.DiagramDesigner
if (this.DataContext is ConnectionViewModel connector && connector.AnimationViewModel != null)
{
connector.AnimationViewModel.PropertyChanged -= Connector_PropertyChanged;
connector.AnimationViewModel.PropertyChanged += Connector_PropertyChanged;
connector.AnimationViewModel.PropertyChanged += Connector_PropertyChanged;
}
this.ball.Visibility = Visibility.Collapsed;
await DoAnimation();
@@ -56,6 +56,11 @@ namespace AIStudio.Wpf.DiagramDesigner
case nameof(AnimationViewModel.Duration):
await DoAnimation();
break;
case nameof(AnimationViewModel.Start):
await Application.Current.Dispatcher.BeginInvoke(async () => {
await DoAnimation();
});
break;
}
}
@@ -64,26 +69,36 @@ namespace AIStudio.Wpf.DiagramDesigner
{
if (this.DataContext is ConnectionViewModel connector && connector.IsFullConnection)
{
await System.Threading.Tasks.Task.Delay(100);
if (connector.AnimationViewModel.Repeat == false)
{
if (connector.AnimationViewModel.Start == false || connector.AnimationViewModel.Completed == 1)
{
return;
}
connector.AnimationViewModel.Completed = 1;
connector.AnimationViewModel.Start = false;
}
await System.Threading.Tasks.Task.Delay(10);
switch (connector.AnimationViewModel.Animation)
{
case LineAnimation.None:
_story?.Stop(this);
ball.Visibility = Visibility.Collapsed;
case LineAnimation.None:
_story?.Stop(this);
ball.Visibility = Visibility.Collapsed;
break;
case LineAnimation.PathAnimation:
if (connector.ColorViewModel.FillColor.BrushType == BrushType.SolidColorBrush && connector.ColorViewModel.FillColor.Color == Colors.White)
{
connector.ColorViewModel.FillColor.Color = Colors.Red;
}
PathAnimation(connector.AnimationViewModel.Duration);
PathAnimation(connector.AnimationViewModel);
break;
case LineAnimation.DashAnimation:
if (connector.ColorViewModel.LineDashStyle == LineDashStyle.None)
{
connector.ColorViewModel.LineDashStyle = LineDashStyle.Dash1;
}
DashAnimation(connector.AnimationViewModel.Duration);
DashAnimation(connector.AnimationViewModel);
break;
}
}
@@ -91,14 +106,14 @@ namespace AIStudio.Wpf.DiagramDesigner
Storyboard _story;
private void PathAnimation(double second)
private void PathAnimation(IAnimationViewModel animationViewModel)
{
this.ball.Visibility = Visibility.Visible;
Canvas.SetTop(this.ball, -this.ball.ActualHeight / 2);
Canvas.SetLeft(this.ball, -this.ball.ActualWidth / 2);
this.ball.RenderTransformOrigin = new Point(0.5, 0.5);
this.ball.RenderTransformOrigin = new Point(0.5, 0.5);
TranslateTransform translate = new TranslateTransform();
RotateTransform rotate = new RotateTransform();
@@ -114,7 +129,7 @@ namespace AIStudio.Wpf.DiagramDesigner
DoubleAnimationUsingPath animationX = new DoubleAnimationUsingPath();
animationX.PathGeometry = this.line.Data?.GetFlattenedPathGeometry();
animationX.Source = PathAnimationSource.X;
animationX.Duration = new Duration(TimeSpan.FromSeconds(second));
animationX.Duration = new Duration(TimeSpan.FromSeconds(animationViewModel.Duration));
DoubleAnimationUsingPath animationY = new DoubleAnimationUsingPath();
animationY.PathGeometry = this.line.Data?.GetFlattenedPathGeometry();
@@ -134,7 +149,15 @@ namespace AIStudio.Wpf.DiagramDesigner
_story.Children.Add(animationY);
_story.Children.Add(animationAngle);
_story.Completed += (s, d) => {
_story.Begin(this, true);
if (animationViewModel.Repeat)
{
_story.Begin(this, true);
}
else
{
this.ball.Visibility = Visibility.Collapsed;
animationViewModel.Completed = 100;
}
};
Storyboard.SetTargetName(animationX, "translate");
Storyboard.SetTargetName(animationY, "translate");
@@ -147,12 +170,12 @@ namespace AIStudio.Wpf.DiagramDesigner
}
private void DashAnimation(double second)
private void DashAnimation(IAnimationViewModel animationViewModel)
{
this.ball.Visibility = Visibility.Collapsed;
var animation = new DoubleAnimation(0, -10, new Duration(TimeSpan.FromSeconds(second)))
var animation = new DoubleAnimation(0, -10, new Duration(TimeSpan.FromSeconds(animationViewModel.Duration)))
{
RepeatBehavior = RepeatBehavior.Forever,
};
@@ -163,6 +186,17 @@ namespace AIStudio.Wpf.DiagramDesigner
_story = new Storyboard();
_story.RepeatBehavior = RepeatBehavior.Forever;
_story.Children.Add(animation);
_story.Completed += (s, d) => {
if (animationViewModel.Repeat)
{
_story.Begin(this, true);
}
else
{
this.ball.Visibility = Visibility.Collapsed;
animationViewModel.Completed = 100;
}
};
_story.Begin(this, true);
}