如何在WinRT XAML中使TextBlock的值发生更改时进行动画处理?

3
我有以下的Storyboard
<Storyboard x:Name="DeleteStoryboard">
    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="StatusTextBlock">
        <EasingDoubleKeyFrame KeyTime="0" Value="1"/>
        <EasingDoubleKeyFrame KeyTime="0:0:4" Value="1"/>
        <EasingDoubleKeyFrame KeyTime="0:0:5" Value="0"/>
    </DoubleAnimationUsingKeyFrames>
</Storyboard>

以下是TextBlock的内容。

<TextBlock x:Name="StatusTextBlock" Text="{Binding Status}">

这两个都在SettingsFlyout中,而不是在Page中。

我希望当TextBlock的值改变时,Storyboard可以开始运行。

我正在使用MVVM,所以除非绝对必要,否则请勿使用代码后台。

我尝试搜索提示,并尝试了不同的BehaviorsTriggersVisualState组合,但没有进展。


很抱歉,但您的要求存在冲突。UI 操作和动画应该在代码后台中进行管理。您使用 MVVM 管理数据并不改变这一事实。MVVM 有意从视图模型中删除视图的引用。如果您包括“无代码后台内容”的动画要求,恐怕您已经破坏了设计模式的核心概念,这并没有真正意义上的要求。并不是说它不能完成。但您的要求暗示了该模式,然后又否定了它。不确定是否适合回答。 - Jerry Nixon
感谢@JerryNixon-MSFT。我想我们总体上是同意的。在我的问题中,我试图避免那些我可以在MSDN代码示例中找到答案的回答;比如处理事件、操作数据,然后调用MyStoryboard.Begin(),所有这些都在代码后台完成。我的应用程序响应按钮按下执行命令,在ViewModel中执行操作,然后使用Status属性向视图报告状态。此时,我想要对TextBlock进行动画处理。我知道操作已经完成并且从Status属性中获取了它的状态。简而言之,获取状态并进行动画处理。这样是否更有意义并改变了答案? - TheBlueSky
使用行为。我认为这对你最好。 - Jerry Nixon
1个回答

6

可能我们并不完全同意,但以下是你可以做的方式:

public class MyViewModel : INotifyPropertyChanged
{
    public string Text { get; set; }
    public event PropertyChangedEventHandler PropertyChanged;
}

public void Loaded()
{
    var myBox = new TextBox();
    var myAni = new Storyboard();
    var MyVvm = new MyViewModel();

    // sensible approach
    myBox.TextChanged += (s, e) => myAni.Begin();

    // forced approach
    MyVvm.PropertyChanged += (s, e) =>
    {
        if (e.PropertyName.Equals("Text"))
            myAni.Begin();
    };
}

最终,你是自己应用程序的开发者,而不是我。

如果你愿意使用行为(behaviors),你也可以这样做:

<Page.Resources>
    <Storyboard x:Name="FadeAway">
        <DoubleAnimation Duration="0:0:1" To="0" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="textBox" d:IsOptimized="True"/>
    </Storyboard>
</Page.Resources>

<TextBox x:Name="textBox">
    <Interactivity:Interaction.Behaviors>
        <Core:EventTriggerBehavior EventName="TextChanged">
            <Media:ControlStoryboardAction Storyboard="{StaticResource FadeAway}"/>
        </Core:EventTriggerBehavior>
    </Interactivity:Interaction.Behaviors>
</TextBox>

我认为你可以使用行为来实现“纯”MVVM模式。这样可以100%使用XAML,对于某些开发人员而言这是一种很有好感的方式。我明白这一点。而且我也喜欢行为。看吧,我并不想在这里与你争论,只是想说这种方法绝对不是“错误”的。

了解更多关于行为的信息:http://blog.jerrynixon.com/2013/10/everything-i-know-about-behaviors-in.html

祝你好运。


提出了两种好方法,谢谢Jerry。我也喜欢你对开发人员想要感到温暖和舒适的评论。 :) - Scott Ferguson
@Jerry,我注意到你使用了一个Textbox而不是TextBlock。有没有办法在TextBlock上使用行为和propertyChanged事件来获得相同的功能? - iam.Carrot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接