我编写了一个从 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 并且不应该提供任何逻辑,但是有没有办法解决这个问题?
提前致谢。