2 回答
TA贡献1946条经验 获得超4个赞
一个非常简单直接的解决方案是在后面的代码中运行动画:
var viewModel = new ViewModel();
viewModel.PropertyChanged += (s, e) =>
{
if (e.PropertyName == nameof(viewModel.Steps))
{
drehteller.RenderTransform.BeginAnimation(
RotateTransform.AngleProperty,
new DoubleAnimation
{
By = viewModel.Steps * 72,
Duration = TimeSpan.FromSeconds(3)
});
}
};
DataContext = viewModel;
这与 MVVM 并不矛盾,因为视图模型仍然对视图一无所知。这是一个纯粹的视图方面。
TA贡献2080条经验 获得超4个赞
您还可以使用附加行为来完成此操作。这些是可重用的视图逻辑,您可以将它们附加到各种 UI 元素,而无需将它们放在代码隐藏中。
您将需要Microsoft.Xaml.Behaviors.Wpf NuGet 包(这曾经作为 Visual Studio 的“Blend for Visual Studio SDK for .NET”组件的一部分进行分发,但在 VS 2019 中发生了变化)。
定义你的行为。请注意,AssociatedObject
指的是Image
与此行为相关的 ,请参见下文。
public class AnimateBehavior : Behavior<Image>
{
public int Steps
{
get => (int)GetValue(StepsProperty);
set => SetValue(StepsProperty, value);
}
public static readonly DependencyProperty StepsProperty =
DependencyProperty.Register(nameof(Steps), typeof(int), typeof(AnimateBehavior), new PropertyMetadata(0, (d, e) => ((AnimateBehavior)d).StepsChanged(e)));
private void StepsChanged(DependencyPropertyChangedEventArgs e)
{
if (AssociatedObject == null)
return;
AssociatedObject.RenderTransform.BeginAnimation(
RotateTransform.AngleProperty,
new DoubleAnimation()
{
By = (int)e.NewValue * 72,
Duration = TimeSpan.FromSeconds(3),
});
}
}
然后在您的 XAML 中,您将需要此命名空间:
xmlns:behaviors="http://schemas.microsoft.com/xaml/behaviors"
然后:
<Image ...>
<Image.RenderTransform>
<RotateTransform/>
</Image.RenderTransform>
<behaviors:Interaction.Behaviors>
<local:AnimateBehavior Steps="{Binding steps}"/>
</behaviors:Interaction.Behaviors>
</Image>
- 2 回答
- 0 关注
- 134 浏览
添加回答
举报