WinUI 3 桌面 MVVM;在 属性 更改时为 TextBlock 设置动画?
WinUI 3 Desktop MVVM; Animate TextBlock on property change?
您好,我正在尝试了解如何在 属性 更新时为 TextBlock 设置动画。 WinUI3/XAML 的新手,但我发现 https://docs.microsoft.com/en-us/dotnet/desktop/wpf/advanced/how-to-apply-animations-to-text 提供了很多有用的示例,但它们都使用 TextBlock.Loaded。我试过将其更改为 TargetUpdated、SourceUpdated、FrameWork.x、Binding.x 等,但都崩溃了,所以我不确定该放什么。网上有很多例子,但我能找到的似乎是 WPF 或 UWP,但仍然会崩溃。
我的代码与没有绑定的 MS 示例非常相似:
<TextBlock Text="{x:Bind Path=Viewmodel.UpdatedText, Mode=OneWay}">
<TextBlock.Foreground>
<SolidColorBrush x:Name="MySolidColorBrush" Color="Maroon" />
</TextBlock.Foreground>
<TextBlock.Triggers>
<EventTrigger RoutedEvent="TextBlock.Loaded">
<BeginStoryboard>
<Storyboard>
<ColorAnimation AutoReverse="True" Storyboard.TargetName="MySolidColorBrush" Storyboard.TargetProperty="Color" From="DarkOrange" To="SteelBlue" Duration="0:0:1" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</TextBlock.Triggers>
</TextBlock>
它在加载时确实有效,但我想在更新文本时为其设置动画。
我找到的示例之一是 Animate textblock when the value changes,但它也使用 .Loaded。在评论中提到“您必须在绑定中将 NotifyOnTargetUpdated 属性 设置为 true”,但 NotifyOnTargetUpdated 似乎不存在(在 WinUI 中?)。
答案可能很简单,但我对此有点迷茫。我也在使用 MVVM 模式,因此避免了代码隐藏,但看起来像这样简单的东西不需要它查看 Microsoft 的示例?虽然如果我是请随时纠正我。谢谢!
在这种情况下试图“避免code-behind”通常是错误的。 View-related 逻辑应该使用编程语言在视图(或控件)中实现。这确实不会以任何方式破坏 MVVM 模式,因为该模式并不是要首先尝试从视图中消除代码。
使用 标记 语言,例如 XAML 来实现非常先进的 UI 逻辑通常是一种反模式,在 UWP 和 WinUI 3、连触发器都做不到你想要的
引用 ReactiveUI docs,“C# 是一种比 XAML 更具表现力、更简洁的语言,虽然您可以在不编写任何代码的情况下创建整个复杂视图,结果将是无法维护、难以阅读的混乱。"
我的建议是以编程方式实现动画,直接在视图的 code-behind 中或作为附加行为或自定义控件的一部分。
您好,我正在尝试了解如何在 属性 更新时为 TextBlock 设置动画。 WinUI3/XAML 的新手,但我发现 https://docs.microsoft.com/en-us/dotnet/desktop/wpf/advanced/how-to-apply-animations-to-text 提供了很多有用的示例,但它们都使用 TextBlock.Loaded。我试过将其更改为 TargetUpdated、SourceUpdated、FrameWork.x、Binding.x 等,但都崩溃了,所以我不确定该放什么。网上有很多例子,但我能找到的似乎是 WPF 或 UWP,但仍然会崩溃。
我的代码与没有绑定的 MS 示例非常相似:
<TextBlock Text="{x:Bind Path=Viewmodel.UpdatedText, Mode=OneWay}">
<TextBlock.Foreground>
<SolidColorBrush x:Name="MySolidColorBrush" Color="Maroon" />
</TextBlock.Foreground>
<TextBlock.Triggers>
<EventTrigger RoutedEvent="TextBlock.Loaded">
<BeginStoryboard>
<Storyboard>
<ColorAnimation AutoReverse="True" Storyboard.TargetName="MySolidColorBrush" Storyboard.TargetProperty="Color" From="DarkOrange" To="SteelBlue" Duration="0:0:1" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</TextBlock.Triggers>
</TextBlock>
它在加载时确实有效,但我想在更新文本时为其设置动画。
我找到的示例之一是 Animate textblock when the value changes,但它也使用 .Loaded。在评论中提到“您必须在绑定中将 NotifyOnTargetUpdated 属性 设置为 true”,但 NotifyOnTargetUpdated 似乎不存在(在 WinUI 中?)。
答案可能很简单,但我对此有点迷茫。我也在使用 MVVM 模式,因此避免了代码隐藏,但看起来像这样简单的东西不需要它查看 Microsoft 的示例?虽然如果我是请随时纠正我。谢谢!
在这种情况下试图“避免code-behind”通常是错误的。 View-related 逻辑应该使用编程语言在视图(或控件)中实现。这确实不会以任何方式破坏 MVVM 模式,因为该模式并不是要首先尝试从视图中消除代码。
使用 标记 语言,例如 XAML 来实现非常先进的 UI 逻辑通常是一种反模式,在 UWP 和 WinUI 3、连触发器都做不到你想要的
引用 ReactiveUI docs,“C# 是一种比 XAML 更具表现力、更简洁的语言,虽然您可以在不编写任何代码的情况下创建整个复杂视图,结果将是无法维护、难以阅读的混乱。"
我的建议是以编程方式实现动画,直接在视图的 code-behind 中或作为附加行为或自定义控件的一部分。