我目前正在使用 WPF 中的滑块。我的 GUI 窗口有 2 个滑块,它们应该以几种方式一起起作用。slider1
必须始终小于或等于slider2
,并且slider2
必须始终大于或等于slider1
。我第一次尝试使用 C# 代码隐藏来解决这个问题记录在我之前的问题中。这个问题让我的代码得以编译,但在运行时并没有影响我的程序的任何视觉变化。使这些滑块以我需要的方式运行的理想方法是什么?
谢谢你。
假设您的 ViewModel 有 2 个属性Slider1
,Slider2
并且您的 XAML 看起来像这样:
<Slider Value="{Binding Path=Slider1}"/>
<Slider Value="{Binding Path=Slider2}"/>
然后你可以在 ViewModel 中执行你的逻辑,当Slider1
或Slider2
改变时:
public class MyClass: INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
{
var handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
private double _slider1;
public double Slider1
{
get { return _slider1; }
set
{
if (_slider1 != value)
{
_slider1 = value;
OnPropertyChanged("Slider1");
if (_slider1 > Slider2) Slider2 = _slider1;
}
}
}
private double _slider2;
public double Slider2
{
get { return _slider2; }
set
{
if (_slider2 != value)
{
_slider2 = value;
OnPropertyChanged("Slider2");
if (_slider2 < Slider1) Slider1 = _slider2;
}
}
}
}
为了您的方便,您也可以这样做..
private void slider1_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
if (slider1 == null || slider2 == null)
return;
if (slider1.Value >= slider2.Value)
{
slider2.Value = slider1.Value;
}
}
private void slider2_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
if (slider1 == null || slider2 == null)
return;
if (slider2.Value <= slider1.Value)
{
slider1.Value = slider2.Value;
}
}