2013-08-31 49 views
4

我有一大堆CheckBox和一些TextBox輸入的長形式。我希望任何時候任何控件發生更改時都會引發事件(即任何CheckBox狀態發生更改或任何TextBox.Text發生更改)。有沒有一種全球的方式來做到這一點,而無需爲每個控件添加事件處理程序?如何在每次更改控件時獲取事件?

+0

我可以知道爲什麼要爲此發生全局事件嗎? – Nitin

回答

7

WPF及其聲明性特性之一是事件沿着可視化樹繼承下來。

<Window x:Class="MyApplication.MainWindow" 
    .... 
    TextBox.TextChanged="TextBox_TextChanged" CheckBox.Checked="CheckBox_Checked"> 

所有TextBoxCheckBox控件將繼承這些事件處理程序。在其他控件(如Grid)中可以採用相同的方法,因此只有網格中的控件受到影響。

+3

'TextBox_OnLostFocus'是一個'TextChanged'處理程序的奇怪名稱:) – hvd

+1

@hvd - 哈哈對不起,我還在想[這個問題](http://stackoverflow.com/questions/18550588/listbox-not-highlighting - 選擇標籤更改#comment27288472_18550588)關於重點。使用相同的測試項目。 – keyboardP

+0

不知道關於WPF,是要指出所有的控件都可以訂閱相同的方法(鑑於簽名textchanged和checkledchange可以是相同的),但這表明,而不僅僅是說。 – jmoreno

1

這樣做的一種方法是對CheckBoxTextBox類進行子類化並在這些類中實現所需的處理程序。

您仍然需要檢查您的應用程序,並將標準CheckBoxTextBox替換爲您的課程。

1

您可以在窗口或用戶控件上使用TextBoxBase.TextChanged =「MainWindow_OnTextChanged」。

1

在WPF中有所謂的類事件。把這種形式的構造函數:

EventManager.RegisterClassHandler(typeof(TextBox), TextBox.TextChangedEvent, 
    new RoutedEventHandler(AnyTextBox_OnTextChanged)); 

這樣你註冊一個處理程序TextChanged事件的所有文本框。與複選框類似:

EventManager.RegisterClassHandler(typeof(CheckBox), CheckBox.CheckedEvent, 
    new RoutedEventHandler(AnyCheckBox_OnChecked)); 
相關問題