[英]How to handle events of a control instantiated in codebehind
我有一個WPF UserControl,我在其中創建一個TextBox,而不是在xaml中。 TextBox可以正常顯示和工作,我可以訪問其方法並執行諸如從中獲取文本的操作。
現在,我要處理該TextBox的TextChanged事件。 我無法使用OnTextChanged方法,因為我正在嘗試處理UserControl的子級,而不是UserControl本身。 因為TextBox是動態創建的,而不是在xaml中動態創建的,所以我不能使用xaml Click在后面的UserControl代碼中指定事件的處理程序。
我終於嘗試使用TextBox的TextBox.AddHandler方法,並且如果我能使它工作的話,那似乎很有希望。
這是我的代碼中的一些片段:
我包含此行是為了使我的代碼能夠識別TextBoxBase事件組:
using System.Windows.Controls.Primitives;
這是類的定義:
public partial class UniversalControl : UserControl
{
這是類中實例化TextBox的行:
private TextBox theText = new TextBox();
這是用來設置一些控件的方法,其中TextBox是其中的一個:
private void InitializeControl(ControlTypes Type)
{
並且,這是該方法中導致錯誤的行。 我在這里嘗試將事件處理程序設置為我在UniversalControl類中定義的方法。
theText.AddHandler(TextBoxBase.TextChanged, new RoutedEventHandler(OnTextBoxTextChanged));
}
這是事件處理程序本身:
private void thePanel_TextChanged(object sender, TextChangedEventArgs e)
{
MessageBox.Show("The text changed.");
}
引發的錯誤是:
CS0120 An object reference is required for the non-static field, method, or property, 'TextBoxBase.TextChanged'
為什么會出現此錯誤? 我搜索了幾個小時,發現很多人遇到此錯誤,但是在我的特定情況下都沒有。
請提供不需要xaml的解決方案(我的UserControl中不需要)。 請記住,文本框未在xaml中定義。 我也不熟悉xaml來構建復雜的樣式或模板。
也許我可以采取另一種方法。 我的願望是動態創建TextBox,並使它僅在需要時顯示。 其他控件可能會在我的UserControl的其他實例中代替它出現。
您可以通過兩種方式執行此操作。 他們倆都做同樣的事情 。
TextChanged
是一個event
,是TextBox
的實例成員。 這樣分配一個處理程序。 您不需要new RoutedEventHandler()
。 這是常規的.NET事件處理,不特定於XAML。 我推薦這種方法。
theText.TextChanged += OnTextBoxTextChanged;
您嘗試使用的方法是XAML。 按照慣例,靜態路由事件屬性命名為TextBoxBase.TextChangedEvent
。 XAML使用它來通過EventSetter
等添加事件處理程序。 無需您費心,但是如果您是貪食的懲罰者,則如下所示:
theText.AddHandler(TextBoxBase.TextChangedEvent,
new TextChangedEventHandler(OnTextBoxTextChanged));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.