Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何限制相互依赖滑块的范围?_C#_Wpf_Binding_Slider - Fatal编程技术网

C# 如何限制相互依赖滑块的范围?

C# 如何限制相互依赖滑块的范围?,c#,wpf,binding,slider,C#,Wpf,Binding,Slider,两个滑块用于显示间隔值。 例如,范围为0-100,在滑块的“最小”和“最大”属性中设置。 我想确保滑块值不能相互传递。间隔较低值的滑块的拇指不得拖过第二个滑块的值,反之亦然 将第一个滑块的值绑定到另一个滑块的最小/最大属性之一(反之亦然)会导致在修改第一个滑块时移动第二个滑块的拇指,因为范围正在更改。所以我想保持两个滑块的范围固定 如何限制拇指的移动 谢谢 更新: 在我的附加属性中,我订阅了在OnSliderMoved中处理的ValueChanged事件: private static void

两个滑块用于显示间隔值。 例如,范围为0-100,在滑块的“最小”和“最大”属性中设置。 我想确保滑块值不能相互传递。间隔较低值的滑块的拇指不得拖过第二个滑块的值,反之亦然

将第一个滑块的值绑定到另一个滑块的最小/最大属性之一(反之亦然)会导致在修改第一个滑块时移动第二个滑块的拇指,因为范围正在更改。所以我想保持两个滑块的范围固定

如何限制拇指的移动

谢谢

更新:

在我的附加属性中,我订阅了在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">
滑动移动上的私有静态void(对象发送方,RoutedPropertyChangedEventArgs参数) { double min=GetMin((DependencyObject)发送方); double max=GetMax((DependencyObject)发送方); 如果(发送器为滑块) { 变量sld=(滑块)发送器; var currentValue=sld.值; //检查该值是否已更改 if(Math.Abs(args.NewValue-args.OldValue)<0) { args.Handled=true; 返回; } 双val=0.0; var result=ValidationResult.Ok; 尝试 { 尝试 { val=Convert.ToDouble(currentValue,CultureInfo.InvariantCulture); val=数学四舍五入(val+0.0005,3); } 捕获(例外e) { 投掷; } 结果=超出最小值(val),最小值(双倍),最大值(双倍); } 捕获(溢出例外) { 结果=ValidationResult.TooLarge; } 开关(结果) { 案例验证结果.TooLarge: //将滑块值重置为最大值 sld.值=最大值; args.Handled=true; 打破 案例验证结果。太小: //将滑块值重置为最小值 sld.值=最小值; args.Handled=true; 打破 案例验证结果。确定: BindingExpression binding=BindingOperations.GetBindingExpression(sld,RangeBase.ValueProperty); if(绑定!=null) { binding.UpdateSource(); } 打破 } } } 这样,拇指的运动就停止了,这正是我想要的。 问题是,如果我继续沿阻止的方向拖动鼠标,绑定会得到更新,尽管拇指没有朝该方向移动


如何中断绑定更新?

使用这样的简单视图模型应该会导致预期的行为:

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"));
            }
        }
    }
}
公共类视图模型:INotifyPropertyChanged
{
公共事件属性更改事件处理程序属性更改;
私人双低价;
公共双下限值
{
获取{return lowerValue;}
设置
{
如果(值=较低的值)
{
上限值=上限值;
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(“UpperValue”);
}
}
}
}
将两个滑块绑定到视图模型的两个属性:

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


移动滑块时,您可以检查滑块是否可以进一步移动。只需使用ValueChanged事件。您可能需要使用范围滑块控件,例如:这个:@MacakM:谢谢,这就是我要找的。我最终创建了一个附加属性,该属性使用OnValueChanged来检查值是否在所需范围内。@Clemens:我想这是一个更好的解决方案,但在我的应用程序中滑块需要保持分离问题是,Min和Max属性位于泛型类中,在该类中,我无法对t类型的值进行值比较。我的ViewModel仅提供这些对象的列表。