2 回答

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超4個(gè)贊
一個(gè)非常簡單直接的解決方案是在后面的代碼中運(yùn)行動(dòng)畫:
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 并不矛盾,因?yàn)橐晥D模型仍然對(duì)視圖一無所知。這是一個(gè)純粹的視圖方面。

TA貢獻(xiàn)2080條經(jīng)驗(yàn) 獲得超4個(gè)贊
您還可以使用附加行為來完成此操作。這些是可重用的視圖邏輯,您可以將它們附加到各種 UI 元素,而無需將它們放在代碼隱藏中。
您將需要Microsoft.Xaml.Behaviors.Wpf NuGet 包(這曾經(jīng)作為 Visual Studio 的“Blend for Visual Studio SDK for .NET”組件的一部分進(jìn)行分發(fā),但在 VS 2019 中發(fā)生了變化)。
定義你的行為。請(qǐng)注意,AssociatedObject
指的是Image
與此行為相關(guān)的 ,請(qǐng)參見下文。
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 關(guān)注
- 169 瀏覽
添加回答
舉報(bào)