2016-10-28 2 views
0

間隔の値を表示するには、2つのスライダを使用します。 範囲は、たとえば0〜100で、スライダのminおよびmaxプロパティで設定されます。 私は、スライダの値が互いに伝わらないことを確認したいと思います。インターバルの低い方の値のスライダの親指は、2番目のスライダの値を超えてドラッグしてはならず、その逆もありません。相互依存型スライダの範囲を制限する方法は?

最初のスライダの値を他のスライダのmin/maxプロパティの1つにバインドすると、その範囲が変更されるため、最初のスライダの変更中に2番目のスライダの親が移動されます。だから私は両方のスライダの範囲を固定したままにしたい。

どのようにして親指の動きを制限できますか?

ありがとうございます!

アップデート:私はOnSliderMovedで処理されValueChangedイベントをサブスクライブ私の添付プロパティで

:これにより

private static void OnSliderMoved(object sender, RoutedPropertyChangedEventArgs<double> args) 
{ 
    double min = GetMin((DependencyObject)sender); 
    double max = GetMax((DependencyObject)sender); 

    if (sender is Slider) 
    { 
    var sld = (Slider)sender; 

    var currentValue = sld.Value; 
    //check if the value has changed at all 
    if (Math.Abs(args.NewValue - args.OldValue) < 0) 
    { 
     args.Handled = true; 
     return; 
    } 

    double val = 0.0; 

    var result = ValidationResult.Ok; 

    try 
    { 
     try 
     { 
      val = Convert.ToDouble(currentValue, CultureInfo.InvariantCulture); 
      val = Math.Round(val + 0.0005, 3); 
     } 
     catch (Exception e) 
     {    
      throw; 
     } 

     result = ExceedsLimits(val, (double)minimum, (double)maximum); 
     }   
    catch (OverflowException) 
    { 
     result = ValidationResult.TooLarge; 
    } 


    switch (result) 
    { 
     case ValidationResult.TooLarge: 
     // reset the slider value to maximum 
     sld.Value = max; 
     args.Handled = true; 
     break; 
     case ValidationResult.TooSmall: 
     // reset the slider value to minimum 
     sld.Value = min; 
     args.Handled = true; 
     break; 
     case ValidationResult.Ok: 
     BindingExpression binding = BindingOperations.GetBindingExpression(sld, RangeBase.ValueProperty); 

     if (binding != null) 
     { 
      binding.UpdateSource(); 
     } 
     break; 
    } 
    } 
} 


<Slider x:Name="sldMaxPercent" 
     Value="{Binding SomeValue, UpdateSourceTrigger=Explicit, 
     Converter={optimat:DoulbeToPercentForSliderConverter}}" 
     Maximum="100"             
     Minimum="0" 
     input:InputService.Min="{Binding ElementName=sldMinPercent, Path=Value, UpdateSourceTrigger=PropertyChanged}" 
     input:InputService.Max="100" 
     IsMoveToPointEnabled="True" 
     IsSelectionRangeEnabled="True" 
     IsSnapToTickEnabled="True" 
     TickFrequency="0.1"> 

、親指の動きは、私が望んでいる、停止します。 問題は、ブロックされた方向にマウスをドラッグし続けても、親指がその方向に動いていなくても、バインディングが更新されるということです。

バインディングの更新を中断するにはどうすればよいですか?

このような単純なビューモデルの使用が期待される動作になるはずです
+1

あなたのスライダーを動かし、それ以上移動できるかどうかを確認することができます。 ValueChangedイベントを使用するだけです。 – MacakM

+0

たとえば、次のような範囲スライダコントロールを使用できます。この1つ:http://mahapps.com/controls/range-slider.html – Clemens

+0

@マカクM:ありがとう、それは私が探していたものでした。 OnValueChangedを使用してValueが希望の範囲内にあるかどうかを確認するために、添付プロパティを作成しました。 – tabina

答えて

0

public class ViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private double lowerValue; 
    public double LowerValue 
    { 
     get { return lowerValue; } 
     set 
     { 
      if (value <= upperValue) 
      { 
       lowerValue = value; 
       PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("LowerValue")); 
      } 
     } 
    } 

    private double upperValue; 
    public double UpperValue 
    { 
     get { return upperValue; } 
     set 
     { 
      if (value >= lowerValue) 
      { 
       upperValue = value; 
       PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("UpperValue")); 
      } 
     } 
    } 
} 

バインドビューモデルの二つの特性に2つのスライダ:

<Slider Maximum="100" Value="{Binding LowerValue}"/> 
<Slider Maximum="100" Value="{Binding UpperValue}"/> 
+0

MinとMaxプロパティは、値の値の比較ができないジェネリッククラスにある私のViewModelは、それらのオブジェクトのリストのみを提供します。 – tabina

関連する問題