MVVM 中的故事板动画

2024-03-24

我试图淡入然后淡出文本块以在 MVVM 中显示成功消息,但我无法让它再次淡出。我看了这个:WPF MVVM 属性更改动画 https://stackoverflow.com/questions/1649828/wpf-mvvm-property-change-animation但并不真正遵循。 这是风格:

 <Style TargetType="TextBlock" x:Key="fadeinout">
        <Style.Triggers>
            <EventTrigger RoutedEvent="Binding.TargetUpdated">
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation Storyboard.TargetProperty="(TextBlock.Opacity)" From="0.0" To="1.0" Duration="0:0:5"/>
                        <DoubleAnimation Storyboard.TargetProperty="(TextBlock.Opacity)" From="1.0" To="0.0" Duration="0:0:5"/>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Style.Triggers>
    </Style>

并在视图中

<TextBlock Text="{Binding Path=SuccessMessage}" Style="{StaticResource fadeinout}"  Width="60"/>

在视图模型中,保存后我执行以下操作:

SuccessMessage = "Success";

其中 SuccessMessage 是一个具有调用 PropertyChanged 的​​ setter 的属性。我想我希望文本固定为“您的保存成功”之类的内容,但无论如何,我希望视图模型能够执行一些操作,使文本块淡入然后再次淡出,并在用户再次保存时重复。我需要做什么?

EDIT(我8小时无法自我回答): 必须将 NotifyOnTargetUpdated 添加到绑定中,现在它淡入淡出:

 <TextBlock Text="{Binding SuccessMessage, NotifyOnTargetUpdated=True}" Style="{StaticResource fadeInOut}"

我现在按照 Jakob 的回答得到了一个 TextBox(但将 EventTrigger 更改为 Binding.TargetUpdated)、一个像上面这样的 TextBlock 和一个像这样的内联 TextBlock:

<TextBlock Text="{Binding SuccessMessage, NotifyOnTargetUpdated=True}" Opacity="0" x:Name="tbMessage" Width="60" HorizontalAlignment="Left">
        <TextBlock.Triggers>
            <EventTrigger RoutedEvent="Binding.TargetUpdated">
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation Storyboard.TargetName="tbMessage" Storyboard.TargetProperty="Opacity" To="1" BeginTime="0:0:0" Duration="0:0:1" />
                        <DoubleAnimation Storyboard.TargetName="tbMessage" Storyboard.TargetProperty="Opacity" To="0" BeginTime="0:0:3" Duration="0:0:1"/>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </TextBlock.Triggers>
    </TextBlock>

每次保存时,所有三个都会淡入和淡出。奇怪的是,尽管使用相同的时间,模板化的一个还是稍微落后于其他两个。


尝试设置DoubleAnimation.BeginTime http://msdn.microsoft.com/en-us/library/system.windows.media.animation.timeline.begintime.aspx。这样你就可以推迟淡出动画的开始时间,这样它就不会在淡入完成之前开始。在以下示例中,文本显示 2 秒后淡出:

<DoubleAnimation Storyboard.TargetProperty="(TextBlock.Opacity)" From="0.0" To="1.0" Duration="0:0:5" BeginTime="0:0:0" />
<DoubleAnimation Storyboard.TargetProperty="(TextBlock.Opacity)" From="1.0" To="0.0" Duration="0:0:5" BeginTime="0:0:7" />

或者你可以使用AutoReverse http://msdn.microsoft.com/en-us/library/system.windows.media.animation.timeline.autoreverse.aspx但是这样您将无法控制淡出之前显示文本的时间。


UPDATE:

事件触发器与 TextBlock 一起使用时似乎出现一些淡出问题,因为 TextBlock 没有任何可以在触发器中使用的适当事件。以下是一个工作示例,其中我使用 TextBox 而不是 TextBlock。尽管 TextBlock 更轻量级,但您始终可以设置 TextBox 的样式,使其看起来像 TextBlock:

<TextBox Text="{Binding SuccessMessage}" Opacity="0" x:Name="textBoxMessage" >
    <TextBox.Triggers>
        <EventTrigger RoutedEvent="TextBoxBase.TextChanged">
            <BeginStoryboard>
                <Storyboard>
                    <DoubleAnimation 
                                Storyboard.TargetName="textBoxMessage" 
                                Storyboard.TargetProperty="Opacity"
                                To="1" 
                                BeginTime="0:0:0" Duration="0:0:1"
                                />
                    <DoubleAnimation 
                                Storyboard.TargetName="textBoxMessage" 
                                Storyboard.TargetProperty="Opacity"
                                To="0" 
                                BeginTime="0:0:3" Duration="0:0:1"
                                />
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </TextBox.Triggers>
</TextBox>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MVVM 中的故事板动画 的相关文章

随机推荐

  • 用于发送字符串数据的简单 rpyc 客户端和服务器

    我正在使用 rpyc 在 python 中编写一个程序 我的目标是创建一个简单的服务器 它接受来自客户端的数据字节 字符串 我对 python 和 rpyc 都很陌生 这是我的 server py 代码 from rpyc utils se
  • 有没有办法从函数内检索 PowerShell 函数名称?

    例如 function Foo string functionName commandRetrievesFoo Write Host This function is called functionName Output PS gt Foo
  • 保持“IN”子句的顺序

    是否可以保持 IN 条件子句的顺序 I found 这个问题 https stackoverflow com questions 8054511 sql is results order mapped to values in in exp
  • 找不到 vcvarsall.bat 文件 [重复]

    这个问题在这里已经有答案了 我正在尝试使用 pip 在我的计算机上安装 Scrapy 在大多数情况下 它可以工作 但在安装过程中不久后 我收到一条错误消息 无法找到 vcvarsall bat 我四处寻找帮助 大多数消息来源都说只需安装 V
  • 突出显示 python 堆栈跟踪

    我正在处理相当复杂的项目 并且一次又一次地我必须通过查看堆栈跟踪来缩小问题范围 它们恰好很长 并且同时涉及 我的 代码 标准库代码和第 3 方库代码 大多数时候 真正的问题出在 我的 代码中 并且在堆栈跟踪中立即找到它对于眼睛来说有点困难
  • 处理 ASP.NET MVC 控制器构造函数中发生的异常

    处理控制器构造函数内发生的异常的最佳方法是什么 我能想到的就是使用 Application OnError 或在我的 ControllerFactory 中放置一个 try catch 这些解决方案似乎都不理想 Application On
  • node.js 区分发出 http 请求时的错误

    我的node js应用程序正在使用http request到 REST APIhttp army gov launch nukes我需要区分三种可能的情况 Success 服务器回复肯定 我知道我的敌人已经被消灭了 Failure 要么我从
  • 如何将 QGraphicsItem QList 保存到文件然后读取它? Qt C++

    我有一个包含 QGraphicsItem 的列表 这个列表让我可以画线 我查看了文档 但没有看到如何将点保存在文件中 然后读取文件的点才能显示它们 这是我的代码 QList
  • 如何解决 Angular 项目中的 Tailwind 和 Bootstrap 冲突

    我在同一个 Angular 项目中使用 Tailwind CSS 和 Bootstrap ngx bootstrap 大多数情况下 他们相处得很好 然而 当涉及到填充和边距时 它们就像兄弟姐妹一样互相争斗 我想使用 Tailwind 进行填
  • LINQ:通过多个属性将对象列表分组到列表列表中的更好方法?

    我有一个这样的对象列表 var cmps new List
  • 如何加快创建聚集索引的速度

    在 SQL Server 中 如果我想向聚簇索引定义添加一新列 则没有用于更改聚簇索引的选项 唯一的选择是删除并使用新定义创建簇索引 据我了解 对于大容量表来说 删除和创建簇索引是非常昂贵且耗时的 聚集索引创建会重建表上的所有非聚集索引 这
  • SharePoint 列表项权限

    我想以编程方式实现它 以便用户只能看到列表中的特定项目 基本上 在创建项目时运行的工作流程中 我将执行一些操作并通知一些人有关此项目的信息 我还希望它更改项目的权限 以便只有特定用户 根据项目内容在运行时查找 才能读取该项目 有权访问该列表
  • 如何轻松更改PNG图像的颜色? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有代表扑克牌的 PNG 图像 它们是标准颜色 梅花和黑桃是空白 方块和红心是红色 我想通过将梅花转换为绿色 将方块转换为蓝色来创建
  • 使用 php 从给定 URL 下载文件,通过传递用户名和密码进行 http 身份验证

    我需要使用 php 代码下载文本文件 该文件具有 http 身份验证 我应该为此使用什么程序 我应该使用fsocketopen或卷曲或有其他方法可以做到这一点吗 我正在使用 fsocketopen 但它似乎不起作用 fp fsockopen
  • OSX:如何从 IOUSBDeviceInterface 或位置 id 获取卷名称(或 bsd 名称)

    我正在尝试编写一个应用程序 将特定的 USB 字符串描述符 USB 大容量存储设备 与其卷或 bsd 名称相关联 因此 代码会遍历所有连接的 USB 设备 获取字符串描述符并从其中之一提取信息 我想获取这些 USB 设备的卷名 我找不到合适
  • android:noHistory="true" 是如何工作的?

    假设我有一个带有菜单的基本活动 当我单击菜单项 A 时 它会转到活动 A 我再次打开菜单 然后转到 B 从 B 返回到 A 这样来回一会儿 所以堆栈将是 A B A B A B 当我按下后退按钮时 它会按预期向后浏览堆栈 然而 假设我不想要
  • v-bind 错误:v-bind' 是未声明的前缀

    我正在 asp net 中使用 Orckestra CMS 在 Composite 之前 和 Razor 模板 并尝试使用 Vue 框架 使用 option text 时一切都很好
  • Jtable 编辑单元格的外观和感觉

    有一个JTable with DefaultTableModel 有桌子的setforeground setbackground and setselectioncolor方法 另外 当您编辑单元格时 您有table setDefaultE
  • 获取图像的特定部分(图片)

    我想剪切图片的特定部分 并用它来将裁剪后的图像与硬盘中存储的另一图像进行比较 问题是我不知道如何获取源图像的 特定部分 我知道要裁剪的图像的位置 X Y 这将加载原始文件并创建一个从 0 0 开始 尺寸为 64x64 的裁剪版本 Bitma
  • MVVM 中的故事板动画

    我试图淡入然后淡出文本块以在 MVVM 中显示成功消息 但我无法让它再次淡出 我看了这个 WPF MVVM 属性更改动画 https stackoverflow com questions 1649828 wpf mvvm property