两个滑块用于显示间隔的值。 该范围例如是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">
这样,拇指运动就会停止,这就是我想要的。 问题是,如果我继续沿阻塞方向拖动鼠标,虽然拇指没有向那个方向移动,但绑定会更新。
如何中断绑定更新?
答案 0 :(得分:1)
使用这样的简单视图模型应该会产生预期的行为:
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"));
}
}
}
}
将两个滑块绑定到视图模型的两个属性:
<Slider Maximum="100" Value="{Binding LowerValue}"/>
<Slider Maximum="100" Value="{Binding UpperValue}"/>