Вы можете создать присоединяемое свойство многократного использования, которое может быть присоединено к любому элементу управления, производному от UIElement
(поскольку именно там свойство Opacity
определено на самом низком уровне), например так:
public class OpacityAnimation
{
public static readonly DependencyProperty IsEnabledProperty =
DependencyProperty.RegisterAttached(
"IsEnabled", typeof(bool), typeof(OpacityAnimation), new FrameworkPropertyMetadata(false,
FrameworkPropertyMetadataOptions.AffectsRender, IsEnabledChanged));
public static void SetIsEnabled(DependencyObject element, bool value)
{
element.SetValue(IsEnabledProperty, value);
}
public static bool GetIsEnabled(DependencyObject element)
{
return (bool)element.GetValue(IsEnabledProperty);
}
private static void IsEnabledChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (!(d is UIElement uiElement))
throw new Exception("DependencyObject has to be of type UIElement");
if (e.NewValue is bool isEnabled && isEnabled)
{
var doubleAnimation = CreateAnimation(500);
uiElement.BeginAnimation(UIElement.OpacityProperty, doubleAnimation);
}
else
{
uiElement.BeginAnimation(UIElement.OpacityProperty, null);
}
}
private static AnimationTimeline CreateAnimation(int durationMs)
{
return new DoubleAnimation
{
FillBehavior = FillBehavior.Stop,
RepeatBehavior = RepeatBehavior.Forever,
AutoReverse = true,
Duration = new Duration(TimeSpan.FromMilliseconds(durationMs)),
From = 0,
To = 1
};
}
}
Создайте этот класс в любом месте вашего проекта.
Затем, чтобы использовать его: (Не забудьте сослаться на ваше пространство имен в XAML)
<Path attachedProperties:OpacityAnimation.IsEnabled="{Binding IsBlinking}"
Data="M 0,0 L 0,50 L 50,50 L 50,0" Fill="Red"/>
Таким образом, вы можете прикрепить это к любому свойству и привязать IsEnabled
к свойству ViewModel для управления анимацией. Вам даже не нужен раскадровка для простых анимаций, подобных этой.
Прикрепленные свойства - фантастическая особенность WPF!