我有一个滑块控件,应用和用户都将进行调整。当值改变时,滑块将触发ValueChanged事件,但我只想触发它,如果它来自用户,即鼠标或键盘输入改变了它。我想我可以用艰难的方式去做,检查鼠标和键盘事件并设置一个bool,但如果可能的话,我宁愿在一个事件中处理它。
如何查看更改值的人?
private void slider1_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) {
if(wasUser) {
...
}
}
答案 0 :(得分:1)
快速而肮脏的方法是利用事件处理程序通过属性设置器同步调用这一事实 - 因此设置一个字段(可由所有处理程序访问),以便在当前事件间接引发的情况下有选择地忽略事件以前的事件处理程序而不是直接用户操作。
考虑一个文本框,该文本框可以由程序设置文本,也可以由用户输入:
class MyWindow : Window {
private Boolean isIndirectEvent = false;
void Timer_Tick() {
this.isIndirectEvent = true;
this.TextBox.Text = "foo"; // TextBox_TextChanged will be invoked inside this property's setter
this.isIndirectEvent = false;
}
void TextBox_TextChanged(Object sender, EventArgs e) {
if( this.isIndirectEvent ) return;
this.InvokeTurboEncabulator();
}
}
(当然,“最佳”方法是使用MVVM,依赖属性和数据绑定,这完全可以避免这类问题,但这需要对您的程序进行重大更改,fwiw)。