我有一个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的其他实例中。
答案 0 :(得分:0)
你可以这两种方式。 They both do the same thing。
TextChanged
是event
,TextBox
的实例成员。像这样为它分配一个处理程序。你不需要new RoutedEventHandler()
。这是传统的.NET事件处理,不是特定于XAML。我推荐这种方法。
theText.TextChanged += OnTextBoxTextChanged;
您尝试使用的方法是XAML。按惯例,静态路由事件属性按TextBoxBase.TextChangedEvent
命名。 XAML使用EventSetter
添加事件处理程序等等。你不需要为此烦恼,但如果你是一个贪婪的惩罚者,那就像这样:
theText.AddHandler(TextBoxBase.TextChangedEvent,
new TextChangedEventHandler(OnTextBoxTextChanged));