これは、悪い状態になると更新を停止するコントロール自体の問題のようです。この場合 (簡単に再現できます)、Binding はプロパティを間違った順序で更新しており (それについては何もできません)、ProgressBar
更新が停止します。これを修正する ProgressBar の簡単なサブクラスをまとめましたが、クリーンアップはあなたに任されています :)
public class RobusterProgressBar : ProgressBar
{
new public static readonly DependencyProperty ValueProperty =
DependencyProperty.Register("Value", typeof(double), typeof(RobusterProgressBar), new PropertyMetadata(ValueChanged));
new static void ValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var control = (RobusterProgressBar)d;
control.Value = (double)e.NewValue;
}
new public static readonly DependencyProperty MaximumProperty =
DependencyProperty.Register("Maximum", typeof(double), typeof(RobusterProgressBar), new PropertyMetadata(MaximumChanged));
static void MaximumChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var control = (RobusterProgressBar)d;
control.Maximum = (double)e.NewValue;
}
private double _value;
new public double Value
{
get { return _value; }
set {
_value = value;
// only update the reflected Value if it is valid
if (_value <= _maximum)
{
Update();
}
}
}
private double _maximum;
new public double Maximum
{
get { return _maximum; }
set {
_maximum = value;
// only update the reflected maximum if it is valid
if (_maximum >= _value)
{
Update();
}
}
}
private void Update()
{
// set all of the ProgressBar values in the correct order so that the ProgressBar
// never breaks and stops rendering
base.Value = 0; // assumes no negatives
base.Maximum = _maximum;
base.Value = _value;
}
}
基本的に、すべての数値が有効になるまで (基本的なvalue <= maximum
ルールに基づいて)、実際のコントロールへの更新を延期するだけです。私のテストアプリでは、このバージョンではそうではありませんが、通常ProgressBar
はしばらくすると死にます。
ちなみに、XAML の使用法は同じです。
<local:RobusterProgressBar Maximum="{Binding Played}" Value="{Binding Won}"/>