Как запустить анимацию, определенную в стиле, из элемента управления, реализующего ее? - PullRequest
0 голосов
/ 21 сентября 2011

Я создал состояние в стиле с именем «Ошибка» с вложенной анимацией в раскадровке.

Я хотел бы иметь возможность запускать эту анимацию из элемента управления, использующего этот стиль, всякий раз, когда выполняется определенное условие.

Например, когда для свойства в DataContext моего просмотра задано определенное значение.

Как именно я могу запустить раскадровку, определенную в стиле элемента управления?

Ответы [ 3 ]

2 голосов
/ 21 сентября 2011

В коде элемента управления просто выполните

Storyboard myStoryboard = this.FindResource("NameOfMyStoryBoard") as Storyboard;

if(myStoryboard != null)
{
    myStoryboard.Begin();
}

Если ваша раскадровка не задана в качестве ресурса, а встроена в ваш стиль, объявите его как ресурс и укажите его в своем стиле.

Документация MSDN: Раскадровка

1 голос
/ 21 сентября 2011

В итоге я создал класс, который будет содержать все свойства зависимостей проверки моих элементов управления:

public class ValidationProperties
{
     #region IsValid Dependency Property

    /// <summary>
    /// An attached dependency property which provides an
    /// </summary>
    public static readonly DependencyProperty IsValidProperty;

    /// <summary>
    /// Gets the <see cref="IsValidProperty"/> for a given
    /// <see cref="DependencyObject"/>, which provides an
    /// </summary>
    public static bool GetIsValid(DependencyObject obj)
    {
        return (bool)obj.GetValue(IsValidProperty);
    }

    /// <summary>
    /// Sets the attached <see cref="IsValidProperty"/> for a given
    /// <see cref="DependencyObject"/>, which provides an
    /// </summary>
    public static void SetIsValid(DependencyObject obj, bool value)
    {
        obj.SetValue(IsValidProperty, value);
    }

     #endregion IsValid Dependency Property

    static ValidationProperties()
    {
        // Register attached dependency property
        IsValidProperty = DependencyProperty.RegisterAttached("IsValid",
                                                            typeof(bool),
                                                            typeof(ValidationProperties), 
                                                            new FrameworkPropertyMetadata(true));
    }
}

После этого я изменил стиль для запуска анимации в зависимости от значения этого свойства для элемента управления, который использует стиль:

(...)

<Trigger Property="AttachedProperties:ValidationProperties.IsValid" Value="false">
    <Trigger.EnterActions>
        <BeginStoryboard Storyboard="{StaticResource ControlIsInvalid}"/>
    </Trigger.EnterActions>
</Trigger>

(...)

Наконец, я связал свойство зависимости в элементе управления, который использует стиль, со значением в модели (через модель представления):

<TextBox x:Name="UsernameTextbox"
       (...)
       AttachedProperties:ValidationProperties.IsValid="{Binding SessionHandler.SessionUser.UsernameIsValid}"/>
1 голос
/ 21 сентября 2011

Вот как вы делаете это из XAML с помощью триггеров:

<Style TargetType="Button" x:Key="MyStyle">
            <Style.Resources>
                <Storyboard x:Key="MyGetFocusAnimation">
                    <DoubleAnimation Storyboard.TargetProperty="Height"
                                     To="50"
                                     Duration="0:0:.3" />
                </Storyboard>
                <Storyboard x:Key="MyLoseFocusAnimation">
                    <DoubleAnimation Storyboard.TargetProperty="Height"
                                     To="30"
                                     Duration="0:0:.3" />
                </Storyboard>
            </Style.Resources>
            <Style.Triggers>
                <Trigger Property="IsMouseOver"
                         Value="True">
                    <Trigger.EnterActions>
                        <BeginStoryboard Storyboard="{StaticResource MyGetFocusAnimation}" />
                    </Trigger.EnterActions>
                    <Trigger.ExitActions>
                        <BeginStoryboard Storyboard="{StaticResource MyLoseFocusAnimation}" />
                    </Trigger.ExitActions>
                </Trigger>
                <Trigger Property="IsKeyboardFocusWithin"
                         Value="True">
                    <Trigger.EnterActions>
                        <BeginStoryboard Storyboard="{StaticResource MyGetFocusAnimation}" />
                    </Trigger.EnterActions>
                    <Trigger.ExitActions>
                        <BeginStoryboard Storyboard="{StaticResource MyLoseFocusAnimation}" />
                    </Trigger.ExitActions>
                </Trigger>
            </Style.Triggers>
        </Style>

После того, как вы определили стиль, как указано выше, вам просто нужно указать кнопке, какой стиль использовать:

<Button Content="Content" Height="20" Width="100" Style="{StaticResource MyStyle}"/>
...