1

私は、valuechange でアニメーションを実装する Progressbar から派生したカスタム コントロールを作成しました (値は、ターゲットに到達するまで doubleanimation でいっぱいになります)。

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

ProgressBar に使用される ControlTemplate は、変更後すぐに新しい値を表示する必要があるため、新しいプロパティ「TargetValue」が使用されます。このために、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 で定義された別の色が使用されます。これは非常にうまく機能します - しかし。今、私はこのバーをいくつかのデータにバインドされているリストビューで使用したいと考えています。問題は、この場合セッターが呼び出されないため、TargetValue={Binding ProgressValue} を介して値が変更された場合でも、アニメーションが実行されないことです。フレームワークは常に GetValue と SetValue を直接呼び出し、ロジックを提供する必要がないことはわかっていますが、これを回避する方法はありますか?

前もって感謝します。

4

1 に答える 1

1

の CLR スタイルのゲッターとセッターはDependencyProperty、フレームワークによって呼び出されることを意図したものではありません...開発者がコードで使用するためにあります。値がいつ変更されたかを知りたい場合は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 に答える