1

我编写了一个从 Progressbar 派生的自定义控件,它在 valuechange 上实现动画(该值用双动画填充,直到达到目标)。

var duration = new Duration(TimeSpan.FromSeconds(2.0));
var doubleanimation = new DoubleAnimation(value, duration)
{
     EasingFunction = new BounceEase()
};
BeginAnimation(ValueProperty, doubleanimation);

使用了一个新属性“TargetValue”,因为用于 ProgressBar 的 ControlTemplate 必须在更改后立即显示新值。为此,ProgressEx 包含以下内容:

public static readonly DependencyProperty TargetValueProperty = DependencyProperty.Register("TargetValue", typeof (int), typeof (ProgressEx), new FrameworkPropertyMetadata(0));
    public int TargetValue
    {
        get { return (int)GetValue(TargetValueProperty); }
        set 
        {
            if (value > Maximum)
            {
                //Tinting background-color
                _oldBackground = Background;
                Background = FindResource("DarkBackgroundHpOver100") as LinearGradientBrush;
            } 
            else
            {
                if (_oldBackground != null)
                    Background = _oldBackground;
            }

            SetValue(TargetValueProperty, value);
            Value = value;
        }
    }

当 TargetValue 超过最大值时,我将使用 xaml 中定义的不同颜色。这真的很好 - 但是。现在我想在绑定到一些数据的列表视图中使用这个栏。问题是,在这种情况下没有调用 setter,因此不会执行动画,即使通过 TargetValue={Binding ProgressValue} 更改了值。我知道框架总是会直接调用 GetValue 和 SetValue 并且不应该提供任何逻辑,但是有没有办法解决这个问题?

提前致谢。

4

1 回答 1

1

s的 CLR 样式 getter 和 setterDependencyProperty并不意味着由框架调用......它们是供开发人员在代码中使用的。如果您想知道DependencyProperty值何时更改,则需要添加一个处理程序:

public static readonly DependencyProperty TargetValueProperty = 
DependencyProperty.Register("TargetValue", typeof (int), typeof (ProgressEx), 
new FrameworkPropertyMetadata(0, OnTargetValueChanged));

private static void OnTargetValueChanged(DependencyObject dependencyObject, 
DependencyPropertyChangedEventArgs e)
{
    // Do something with the e.NewValue and/or e.OldValue values here
}
于 2013-10-30T15:00:27.600 回答