Что лучший способ состоит в том, чтобы запустить анимацию, когда связанное значение изменяется?

это зависит, если Ваш язык и код продвигают: LBYL (взгляд перед прыганием) или EAFP (легче спросить прощение, чем разрешение)

LBYL заявляет, что необходимо проверить на значения (так возвратите пустой указатель)
EAFP заявляет, чтобы просто попробовать операцию и видеть, перестало ли это работать (выдайте исключение)

, хотя я соглашаюсь с вышеупомянутым.. исключения должны использоваться для исключительных / состояний ошибки, и возврат пустого указателя является лучшим при использовании проверок.

EAFP по сравнению с LBYL в Python:
http://mail.python.org/pipermail/python-list/2003-May/205182.html ( веб-Архив )

7
задан Sergey Aldoukhov 13 July 2009 в 23:49
поделиться

2 ответа

Хорошо, вот к чему я пришел после некоторых экспериментов.

Я создал триггер Expression Blend 3 со свойством зависимости (я назвал его подпиской). Я привязываю подписку к тому же значению, к которому привязан мой TextBlock, и этот триггер прикреплен к ControlStoryboardAction из Expression Blend 3.

Вот триггер:

public class DataTriggerPlus : TriggerBase<DependencyObject>
{
    public static readonly DependencyProperty SubscriptionProperty =
        DependencyProperty.Register("Subscription", 
            typeof(string),
            typeof(DataTriggerPlus),
            new FrameworkPropertyMetadata("",
              new PropertyChangedCallback(OnSubscriptionChanged)));

    public string Subscription
    {
        get { return (string)GetValue(SubscriptionProperty); }
        set { SetValue(SubscriptionProperty, value); }
    }

    private static void OnSubscriptionChanged(DependencyObject d,
      DependencyPropertyChangedEventArgs e)
    {
        ((DataTriggerPlus)d).InvokeActions(null);
    }
}

Вот как он прикреплен к раскадровке:

<TextBlock x:Name="textBlock" Text="{Binding TestProp}" Background="White">
    <i:Interaction.Triggers>
        <local:DataTriggerPlus Subscription="{Binding TestProp}">
            <im:ControlStoryboardAction 
                Storyboard="{StaticResource Storyboard1}"/>
        </local:DataTriggerPlus>
    </i:Interaction.Triggers>
</TextBlock>

I мне очень нравится этот подход, отличная работа, дизайнеры Blend 3!

Edit: ответ на комментарий Дрю ...

Да, он поставляется с Blend. Вы можете просто включить Microsoft.Expression.Interactions.dll и System.Windows.Interactivity в свой проект.

И да, это многословно (я спросил, придумал ли кто-нибудь хороший способ применения поведения с помощью стилей в этот вопрос ) - но есть и преимущество гибкости. Например, вы можете не только запустить раскадровку, но и переключить состояние или выполнить какое-либо другое действие с того же триггера.

s как это прикреплено к раскадровке:

<TextBlock x:Name="textBlock" Text="{Binding TestProp}" Background="White">
    <i:Interaction.Triggers>
        <local:DataTriggerPlus Subscription="{Binding TestProp}">
            <im:ControlStoryboardAction 
                Storyboard="{StaticResource Storyboard1}"/>
        </local:DataTriggerPlus>
    </i:Interaction.Triggers>
</TextBlock>

Мне очень нравится этот подход, отличная работа, дизайнеры Blend 3!

Edit: ответ на комментарий Дрю ...

Да, он поставляется с Blend. Вы можете просто включить Microsoft.Expression.Interactions.dll и System.Windows.Interactivity в свой проект.

И да, это многословно (я спросил, придумал ли кто-нибудь хороший способ применить поведение с помощью стилей в этот вопрос ) - но есть и преимущество гибкости. Например, вы можете не только запустить раскадровку, но и переключить состояние или выполнить какое-либо другое действие с того же триггера.

s как это прикреплено к раскадровке:

<TextBlock x:Name="textBlock" Text="{Binding TestProp}" Background="White">
    <i:Interaction.Triggers>
        <local:DataTriggerPlus Subscription="{Binding TestProp}">
            <im:ControlStoryboardAction 
                Storyboard="{StaticResource Storyboard1}"/>
        </local:DataTriggerPlus>
    </i:Interaction.Triggers>
</TextBlock>

Мне очень нравится этот подход, отличная работа, дизайнеры Blend 3!

Edit: ответ на комментарий Дрю ...

Да, он поставляется с Blend. Вы можете просто включить Microsoft.Expression.Interactions.dll и System.Windows.Interactivity в свой проект.

И да, это многословно (я спросил, придумал ли кто-нибудь хороший способ применить поведение с помощью стилей в этот вопрос ) - но есть и преимущество гибкости. Например, вы можете не только запустить раскадровку, но и переключить состояние или выполнить какое-либо другое действие с того же триггера.

И да, это многословно (я спросил, придумал ли кто-нибудь хороший способ применения поведения с помощью стилей в этом вопросе ) - но есть и преимущество гибкости. Например, вы можете не только запустить раскадровку, но и переключить состояние или выполнить какое-либо другое действие с того же триггера.

И да, это многословно (я спросил, придумал ли кто-нибудь хороший способ применения поведения с помощью стилей в этом вопросе ) - но есть и преимущество гибкости. Например, вы можете не только запустить раскадровку, но и переключить состояние или выполнить какое-либо другое действие с того же триггера.

3
ответ дан 7 December 2019 в 12:24
поделиться

Вы можете создать триггер, который будет запускать анимацию.

Примерно так:

<Style>
    <Style.Triggers>
       <Trigger 
            Property="ViewModelProperty"
            Value="True">
            <Trigger.EnterActions>
                 <BeginStoryboard Storyboard="YourStoryBoard" />
            </Trigger.EnterActions>
       </Trigger>
    </Style.Triggers>
</Style>

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

Я пробовал использовать EventTriggers для привязки к завершенным событиям , но это также вызывает некоторые сложности. Подробнее см. здесь .

2
ответ дан 7 December 2019 в 12:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: