繁体   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