如何处理在代码隐藏

时间:2018-04-15 00:58:18

标签: c# wpf

我有一个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'

为什么我收到此错误?我搜索了几个小时,发现很多人遇到这个错误,但没有一个人遇到我特定的情况。

请提供除我的UserControl之外不需要xaml的解决方案。请记住,TextBox未在xaml中定义。我也不太熟悉xaml来构建复杂的样式或模板。

也许我可以采取另一种方法。我的愿望是动态创建TextBox并使其仅在需要时显示。其他控件可能会出现在我的UserControl的其他实例中。

1 个答案:

答案 0 :(得分:0)

你可以这两种方式。 They both do the same thing

TextChangedeventTextBox的实例成员。像这样为它分配一个处理程序。你不需要new RoutedEventHandler()。这是传统的.NET事件处理,不是特定于XAML。我推荐这种方法。

theText.TextChanged += OnTextBoxTextChanged;

您尝试使用的方法是XAML。按惯例,静态路由事件属性按TextBoxBase.TextChangedEvent命名。 XAML使用EventSetter添加事件处理程序等等。你不需要为此烦恼,但如果你是一个贪婪的惩罚者,那就像这样:

theText.AddHandler(TextBoxBase.TextChangedEvent, 
    new TextChangedEventHandler(OnTextBoxTextChanged));