为什么绑定不适用于动画?

最高

我对动画绑定属性有一个简单的问题。这是一个简单的例子来说明:

ViewModel:

public class ViewModel
{

    private double myProperty;

    public double MyProperty
    {
        get { return myProperty; }
        set { myProperty = value; /* Break point here */ }
    }

    public ViewModel()
    {
        MyProperty = 20;
    }

}

MyControl:

public class MyControl : Button
{

    protected override void OnClick()
    {
        base.OnClick();
        Height = ActualHeight + 20;
    }

}

MyAnimatedControl:

public class MyAnimatedControl : Button
{

    protected override void OnClick()
    {
        base.OnClick();
        DoubleAnimation a = new DoubleAnimation(ActualHeight + 20, new Duration(TimeSpan.FromMilliseconds(500)));
        this.BeginAnimation(HeightProperty, a);
    }

}

主窗口:

public partial class MainWindow : Window
{

    public MainWindow()
    {
        DataContext = new ViewModel();
        InitializeComponent();
    }
}

<Grid>
    <StackPanel>
        <local:MyAnimatedControl Height="{Binding MyProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Content="Animated"/>
        <local:MyControl Height="{Binding MyProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Content="Normal 1"/>
        <local:MyControl Height="{Binding MyProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Content="Normal 2"/>
    </StackPanel>
</Grid>

我有两个从Button继承的控件(MyControl和MyAnimatedControl),它们的Height属性绑定(两种方式)到ViewModel中的MyProperty属性。

单击控件时,它们将增大其Height属性。MyControl为它分配一个新值,而MyAnimatedControl为它设置动画。

问题:

当我单击MyControl之一时,绑定正常工作,所有控件的高度都已更新,断点在ViewModel中起作用。但是,当我单击MyAnimatedControl时,绑定似乎不再起作用:它单独增长,并且绑定不再起作用,而两个常规控件仍然一起增长。它不再与其他控件共享相同的高度。

有没有一种方法可以对动画依赖项属性进行操作绑定,这将在整个动画过程中更新ViewModel?我读了这篇文章,但没有回答。

谢谢。

克莱门斯

问题似乎在于,动画属性同时是绑定的来源。为了解决这个问题,您可以创建另一个height属性(例如MyHeight),只要控件的高度发生变化,该属性就会更新,并用作OneWayToSource绑定的目标

public class MyAnimatedControl : Button
{
    public static readonly DependencyProperty MyHeightProperty =
        DependencyProperty.Register(
            "MyHeight", typeof(double), typeof(MyAnimatedControl));

    public double MyHeight
    {
        get { return (double)GetValue(MyHeightProperty); }
        set { SetValue(MyHeightProperty, value); }
    }

    protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo)
    {
        base.OnRenderSizeChanged(sizeInfo);
        MyHeight = sizeInfo.NewSize.Height;
    }
}

绑定:

<local:MyAnimatedControl ...
   MyHeight="{Binding MyProperty, Mode=OneWayToSource}"
   Height="{Binding MyProperty, Mode=OneWay}"/>

为了更新其他绑定目标,您还需要INotifyPropertyChanged在视图模型中实现接口:

public class ViewModel : INotifyPropertyChanged
{
    private double myProperty = 30;
    public double MyProperty
    {
        get { return myProperty; }
        set
        {
            myProperty = value;
            RaisePropertyChanged("MyProperty");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void RaisePropertyChanged(string propertyName)
    {
        var handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

最后,正如Rohit Vats在他的回答中所写,您将需要删除Completed事件处理程序内Height属性上的动画保留:

protected override void OnClick()
{
    base.OnClick();
    DoubleAnimation a = new DoubleAnimation(ActualHeight + 20,
                            new Duration(TimeSpan.FromMilliseconds(500)));
    a.Completed += (s, e) =>
    {
        BeginAnimation(Button.HeightProperty, null); // Remove animation.
        SetCurrentValue(Button.HeightProperty, ActualHeight); // Set value.
    };
    this.BeginAnimation(Button.HeightProperty, a);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么角度绑定不适用于服务原语

来自分类Dev

自定义绑定动画不适用于foreach

来自分类Dev

为什么动画不适用于所有类元素?

来自分类Dev

为什么 css 动画不适用于背景大小 100%

来自分类Dev

为什么数据绑定不适用于我的自定义属性指令

来自分类Dev

CSS动画延迟不适用于fadeIn效果。无论我将延迟设置为什么,动画都会立即开始

来自分类Dev

为什么我的函数适用于矩阵但为什么不适用于向量?

来自分类Dev

为什么动画仅适用于第一张幻灯片而不适用于其他幻灯片?

来自分类Dev

为什么忽略SIGTRAP不适用于asm?

来自分类Dev

为什么Map在Groovy中不适用于GString?

来自分类Dev

为什么python re模块不适用于@?

来自分类Dev

为什么向左滑动不适用于Jquery mobile?

来自分类Dev

为什么这些条件不适用于模板类型?

来自分类Dev

为什么乘法不适用于读取主机值

来自分类Dev

为什么strtok不适用于stringstream?

来自分类Dev

为什么ng-bind不适用于数组?

来自分类Dev

为什么输入模式属性不适用于数字?

来自分类Dev

为什么$别名不适用于此jQuery函数

来自分类Dev

为什么ExtractMpegFramesTest不适用于旋转的输入文件?

来自分类Dev

为什么GCC优化不适用于valarrays?

来自分类Dev

为什么`Condition`属性不适用于`ItemGroup`元素?

来自分类Dev

为什么CustomStringConvertible协议不适用于Int?

来自分类Dev

为什么此委托不适用于UITextView

来自分类Dev

自动装箱为什么不适用于Short(5)?

来自分类Dev

为什么cout不适用于pthreads?

来自分类Dev

为什么innerTEXT不适用于节点?

来自分类Dev

为什么CSS覆盖不适用于嵌套按钮?

来自分类Dev

为什么JUnit DataPoints方法不适用于原语?

来自分类Dev

为什么同步方法不适用于多线程

Related 相关文章

  1. 1

    为什么角度绑定不适用于服务原语

  2. 2

    自定义绑定动画不适用于foreach

  3. 3

    为什么动画不适用于所有类元素?

  4. 4

    为什么 css 动画不适用于背景大小 100%

  5. 5

    为什么数据绑定不适用于我的自定义属性指令

  6. 6

    CSS动画延迟不适用于fadeIn效果。无论我将延迟设置为什么,动画都会立即开始

  7. 7

    为什么我的函数适用于矩阵但为什么不适用于向量?

  8. 8

    为什么动画仅适用于第一张幻灯片而不适用于其他幻灯片?

  9. 9

    为什么忽略SIGTRAP不适用于asm?

  10. 10

    为什么Map在Groovy中不适用于GString?

  11. 11

    为什么python re模块不适用于@?

  12. 12

    为什么向左滑动不适用于Jquery mobile?

  13. 13

    为什么这些条件不适用于模板类型?

  14. 14

    为什么乘法不适用于读取主机值

  15. 15

    为什么strtok不适用于stringstream?

  16. 16

    为什么ng-bind不适用于数组?

  17. 17

    为什么输入模式属性不适用于数字?

  18. 18

    为什么$别名不适用于此jQuery函数

  19. 19

    为什么ExtractMpegFramesTest不适用于旋转的输入文件?

  20. 20

    为什么GCC优化不适用于valarrays?

  21. 21

    为什么`Condition`属性不适用于`ItemGroup`元素?

  22. 22

    为什么CustomStringConvertible协议不适用于Int?

  23. 23

    为什么此委托不适用于UITextView

  24. 24

    自动装箱为什么不适用于Short(5)?

  25. 25

    为什么cout不适用于pthreads?

  26. 26

    为什么innerTEXT不适用于节点?

  27. 27

    为什么CSS覆盖不适用于嵌套按钮?

  28. 28

    为什么JUnit DataPoints方法不适用于原语?

  29. 29

    为什么同步方法不适用于多线程

热门标签

归档