每当任何控件被改变时,我该如何触发事件?

4

我有一个包含多个复选框和一些文本框输入的长表单。我想在任何控件发生更改时引发事件(即更改任何复选框状态或更改任何文本框文本)。是否有一种全局的方法可以做到这一点,而不必为每个控件添加事件处理程序?


请问为什么您想要一个全局事件来处理这个问题? - Nitin
4个回答

7
WPF的一个优点是其声明性质,事件会在可视树中被继承传递。
<Window x:Class="MyApplication.MainWindow"
    ....
   TextBox.TextChanged="TextBox_TextChanged" CheckBox.Checked="CheckBox_Checked">

所有的文本框(TextBox)和复选框(CheckBox)控件都会继承这些事件处理程序。在其他控件,例如网格(Grid)中也可以采用相同的方法,这样只有网格内的控件会受到影响。

3
TextBox_OnLostFocus 对于一个 TextChanged 处理程序来说是一个奇怪的名称 :) - user743382
1
@hvd - 哈哈,抱歉,我还在想着这个问题关于焦点的问题。使用相同的测试项目。 - keyboardP
不知道关于WPF的这一点,本来想指出所有控件都可以订阅同一个方法(只要textchanged和checkledchange的签名相同),但这表明了而不仅仅是说了它。 - jmoreno

1
在WPF中有所谓的类事件。将以下内容放置在窗体的构造函数中:
EventManager.RegisterClassHandler(typeof(TextBox), TextBox.TextChangedEvent, 
    new RoutedEventHandler(AnyTextBox_OnTextChanged));

这样,您可以为所有文本框注册一个事件处理程序。对于复选框也是如此:
EventManager.RegisterClassHandler(typeof(CheckBox), CheckBox.CheckedEvent,
    new RoutedEventHandler(AnyCheckBox_OnChecked));

1
一种实现方法是通过子类化CheckBox和TextBox类,并在这些类中实现所需的处理程序。
您仍然需要遍历应用程序,并用您的类替换标准的CheckBox和TextBox。

1

您可以在窗口或用户控件上使用TextBoxBase.TextChanged="MainWindow_OnTextChanged"。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接