簡體   English   中英

如何處理在代碼背后實例化的控件的事件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM