wpf - 如何在 WPF 中平滑地将绑定的属性值从旧值设置为新值
问题描述
如何从绑定属性的先前值平滑地动画到它的新值?
假设我们有以下 Canvas 和 Line。
<Canvas>
<Line
Canvas.Top="0"
Stroke="#887FFF00"
StrokeThickness="2"
X1="0" Y1="0"
X2="0" Y2="{Binding ActualHeight, RelativeSource={RelativeSource AncestorType=Canvas}}"
Canvas.Left="{Binding Position}"
>
</Line>
</Canvas>
线的水平位置由绑定到 Canvas.Left 附加属性的 Position 属性确定。当位置从 100 变为 200 时,我想将线的位置从其先前的值平滑地动画到它的新值。
我该怎么做呢?
解决方案
到目前为止,在 wpf 中平滑地为属性设置动画的最简单方法是使用动画。
不过,根据您的要求,动画有一些棘手的地方。
您不能在动画上绑定“from”或“to”,因此这将涉及在代码中创建动画。
您需要一个依赖属性,因此需要一个依赖对象来为值设置动画。
您可以考虑制作将位置公开的视图模型到依赖对象中。然后,您可以在需要对其进行动画处理时在代码中创建一个新动画,并将您的绑定保留在那里。
或者......您可以将故事板定义为资源并在代码中更改它以制作动画。
也许你不喜欢把 viewmodel 变成一个依赖对象。
如果您对视图中的一些“代码隐藏”感到满意,那么这就是一个依赖对象。您也可以将依赖属性添加到您的窗口。将其绑定到 Position ,然后为您的行的 canvas.left 或该行绑定到的另一个依赖项属性设置动画。
推荐阅读
- c# - 我只能从大约 8 到 9 中提取数据。但我知道我的 HDA 中有更多数据。我的 ReadRaw 数据函数有问题吗?
- django - Django formset:无法保存
- python - 为什么这个递归函数会迅速增加内存使用?
- javascript - 单击功能会无意中在调试器中“创建”一个新的 html 文档
- c# - Unity Vector2.Lerp "t" 没有按预期工作,它很快
- java - Java、Springboot、MongoDB 扩展 SimpleMongoRepository (2020)
- mysql - MySQL:多插入的顺序是否有保证?
- python - 如何运行 for 循环以打印字符串中的单个元素
- angularjs - 如何计算开始日期和结束日期之间的小时数,不包括AngularJS中的周末
- java - JavaFX 无论如何都可以使用 css 设置选定树视图项的两种颜色