gpt4 book ai didi

wpf - 当绑定(bind)值发生变化时,启动动画的最佳方式是什么?

转载 作者:行者123 更新时间:2023-12-04 12:25:58 25 4
gpt4 key购买 nike

这是经常出现的情况:

在 View 中,您有一个绑定(bind)到 ViewModel 属性的控件(由 INotifyPropertyChanged 支持)。例如:

<TextBlock Text="{Binding Path=Subtotal}"/>

当属性发生变化时,您需要通过一些创意动画来引起用户注意。我如何利用 View 已经连接到通知的事实并避免创建大量额外代码(或至少创建一次并重复使用)。数据触发器可能是最好的选择,但我不知道如何让它们触发任何值更改而不是某个特定值。

想到以下选项:
  • 在 ViewModel 中引发一个附加事件,在 View 代码隐藏中订阅。
  • 使用转换器创建一个绑定(bind)到提到的属性的数据触发器,如果​​值发生变化,该转换器将返回 true。
  • 创建一个绑定(bind)到 ViewModel 上的新 bool 属性的数据触发器,该属性用于“发出信号”更改。
  • 创建附加到控件的行为,该行为将订阅控件的依赖属性更改并启动动画。

  • 你喜欢/使用哪一个?我错过了任何选择吗?

    附言如果解决方案能够提供先启动动画并在动画结束时反射(reflect)值变化的可能性,那就太好了(但不是关键)。

    最佳答案

    好的,这是我经过一些实验后得出的结论。

    我创建了一个带有依赖属性的 Expression Blend 3 触发器(我将其命名为 Subscription)。我将 Subscription 绑定(bind)到与 TextBlock 绑定(bind)的相同值,并且此触发器附加到 Expression Blend 3 中的 ControlStoryboardAction。

    这是触发器:

    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);
    }
    }

    以下是它与 Storyboard 的连接方式:
    <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 设计师做得很好!

    编辑:回答德鲁评论...

    是的,它与 Blend 一起提供。您可以只将 Microsoft.Expression.Interactions.dll 和 System.Windows.Interactivity 包含到您的项目中。

    是的,它很冗长(我问过是否有人想出了一个通过样式 in this question 应用行为的好方法)——但也有灵 active 的好处。例如,您不仅可以启动 Storyboard,还可以从同一个触发器切换状态或执行其他操作。

    关于wpf - 当绑定(bind)值发生变化时,启动动画的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1122177/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com