最大値または最小値が変更されたときの現在の値の比率を保持するスライダを作成しています。境界が変更されたときのスライダの値の正確な比率
ここでは、スライダの値の比率をどのように補正しているかを示す画像を示します。
(第2スライダはよりよい解決策を説明するために展開されている。明らかに、アプリケーションビューのスライダーのサイズは固定と値のみが内部的に変更されている。)
これは、あなたが見るものです結果として。
私は比率を修正するために使用している数式は非常に簡単です。これはMaximum
値が変更されたときに使用される式である:
NewValue = OldValue * ((newMaximum - Minimum)/(oldMaximum - Minimum));
そしてMinimum
値が変更された場合には:
NewValue = OldValue * ((Maximum - newMinimum)/(Maximum - oldMinimum));
(そこゼロ除算を防ぐ例えば、考慮すべきいくつかのことがあるが、それです。オフトピックです)
ここで問題が発生したときを見てください。 newMaximum
がスライダの値より小さいとします。 残念ながらスライダーの内部動作は、value = newMaximum
を実行して値を修正したいので、これが私の計算と競合します。
次の図は、その逆を行って問題を示しています。 2番目のスライダーは私が望むものですが、3番目のスライダーを取得します。
これは私が試したものです。私はOnValueChanged
をオーバーライドしていますが、スライダーをnewMaximum
はあなたが画像で見ることができるようvalue = newMaximum
を実行して、value
より小さいとき値を補正し続けるにもかかわらず
protected override void OnMaximumChanged(double oldMaximum, double newMaximum)
{
if ((oldMaximum - Minimum) <= 0) oldMaximum = Minimum + 1; // prevent 0-division
Value *= (newMaximum - Minimum)/(oldMaximum - Minimum);
base.OnMaximumChanged(oldMaximum, newMaximum);
}
protected override void OnValueChanged(double oldValue, double newValue)
{
//base.OnValueChanged(oldValue, newValue);
}
(コードが簡略化されます)。 どうすれば修正できますか?
警告:次のコードは、あなたが頭痛与えるかもしれません!問題を説明しようとしましたが、理解していただきたいと思います。場合は、ここで私は現在持っているOnMaximumChanged
コードが完全な詳細を知りたいです。
private bool _selfChanging;
protected override void OnMaximumChanged(double oldMaximum, double newMaximum)
{
lock (this)
{
if (_selfChanging) return;
_selfChanging = true;
if (newMaximum < Minimum)
{
IsDirectionReversed = !IsDirectionReversed;
Maximum = Minimum;
newMaximum = Maximum;
Minimum = newMaximum;
}
if ((oldMaximum - Minimum) <= 0) oldMaximum = Minimum + 1;
Value *= (newMaximum - Minimum)/(oldMaximum - Minimum);
base.OnMaximumChanged(oldMaximum, newMaximum);
_selfChanging = false;
}
}
protected override void OnValueChanged(double oldValue, double newValue)
{
//base.OnValueChanged(oldValue, newValue);
}