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