You need a uniform animation, but in steps. This is a non-standard animation, so let's turn to the Sacred Source of Knowledge . It is advised to create your own KeyFrame . This will do.
We inherit from DoubleKeyFrame , since we are animating a property of type double . We need a property that stores the number of parts, we put it in the standard DependencyProperty NumberOfParts . We also need to implement abstract methods CreateInstanceCore (which simply clones our object, for it we will put a protected constructor), and most importantly - the InterpolateValueCore method, which will be our logic for calculating the value.
class StepwiseDoubleKeyFrame : DoubleKeyFrame { public StepwiseDoubleKeyFrame() { } protected StepwiseDoubleKeyFrame(double value, KeyTime keyTime, int numberOfParts) : base(value, keyTime) { NumberOfParts = numberOfParts; } protected override Freezable CreateInstanceCore() => new StepwiseDoubleKeyFrame(Value, KeyTime, NumberOfParts); protected override double InterpolateValueCore(double baseValue, double keyFrameProgress) { var fullDiff = Value - baseValue; // полный путь, который нужно пройти за целый фрейм // в keyFrameProgress текущее время фрейма, от 0 до 1. // считаем, в какую из частей мы сейчас попадаем. // например, если у нас 6 частей, а время между 4/6 и 5/6, по показываем 4/6 var currentPart = Math.Floor(keyFrameProgress * NumberOfParts) / NumberOfParts; return baseValue + currentPart * fullDiff; } public int NumberOfParts { get { return (int)GetValue(NumberOfPartsProperty); } set { SetValue(NumberOfPartsProperty, value); } } public static readonly DependencyProperty NumberOfPartsProperty = DependencyProperty.Register( "NumberOfParts", typeof(int), typeof(StepwiseDoubleKeyFrame), new PropertyMetadata(4)); // по умолчанию 4 части }
Now our XAML looks like this:
<Image HorizontalAlignment="Center" VerticalAlignment="Center" Source="..." RenderTransformOrigin="0.5,0.5" Width="75"> <Image.RenderTransform> <RotateTransform x:Name="Rotation"/> </Image.RenderTransform> <Image.Triggers> <EventTrigger RoutedEvent="Loaded"> <BeginStoryboard> <Storyboard> <DoubleAnimationUsingKeyFrames Storyboard.TargetName="Rotation" Storyboard.TargetProperty="Angle" Duration="0:0:1" RepeatBehavior="Forever"> <local:StepwiseDoubleKeyFrame KeyTime="100%" Value="360" NumberOfParts="8"/> </DoubleAnimationUsingKeyFrames> </Storyboard> </BeginStoryboard> </EventTrigger> </Image.Triggers> </Image>
Result:

DoubleAnimationUsingKeyframes. I will write later if no one has time to me. - VladDDoubleAnimationUsingKeyframesto solve my problem. Or not? - iRumbaKeyFramevalue can be any according to the idea. Well, or you need to think not throughKeyFrame, yes. - VladD