【问题标题】:Check if value change event was triggered by user检查用户是否触发了值更改事件
【发布时间】:2017-05-19 20:57:39
【问题描述】:

我有一个滑块控件,应用程序和用户都会进行调整。当值更改时,滑块将触发 ValueChanged 事件,但我只想触发它是否来自用户,即鼠标或键盘输入更改了它。我想我可以通过艰难的方式来检查鼠标和键盘事件并设置一个布尔值,但如果可能的话,我宁愿在一个事件中处理所有这些。

如何检查谁更改了值?

private void slider1_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) {
   if(wasUser) {
      ...
   }
}

【问题讨论】:

    标签: c# wpf


    【解决方案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)。

    【讨论】:

    • 我决定继续这样做。如果程序正在更新,我将“UserChangedValue”设置为 false。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多