【发布时间】:2011-11-24 14:44:48
【问题描述】:
在我的主窗口中,我有一个包含文本框的子控件(用户控件)。如何处理主(父)窗口中子控件文本框的textchange事件。
由于我是事件路由的新手,请提供一些代码示例。
【问题讨论】:
标签: wpf events event-handling routing event-bubbling
在我的主窗口中,我有一个包含文本框的子控件(用户控件)。如何处理主(父)窗口中子控件文本框的textchange事件。
由于我是事件路由的新手,请提供一些代码示例。
【问题讨论】:
标签: wpf events event-handling routing event-bubbling
您应该能够从父控件中挂钩事件。但是由于您的父控件没有自己的 TextChanged 事件,您需要使用附加属性语法:
<Window ...
TextBox.TextChanged="ChildTextBoxChanged">
在你的代码隐藏中:
private void ChildTextBoxChanged(object sender, TextChangedEventArgs args)
{
...
}
您不必特别将TextBox.TextChanged= 放在Window 上——只要是TextBox 的父级控件,即UserControl 的父级控件即可。该事件将依次冒泡到每个父母,一直到顶级Window,并且可以在沿途的任何地方处理。
(请注意,如果有人挂钩事件并设置 e.Handled = true,则事件不会冒泡超过该点。了解您是否有多个级别的处理程序很有用。)
【讨论】:
这也帮助了我。我将在子控件的容器中有一个事件,并在代码隐藏文件中定义该事件。该事件将处理所有孩子的所有文本更改事件。
<StackPanel TextBoxBase.TextChanged="test_TextChanged" Name="test">
<userControl/>
</StackPanel>
【讨论】:
在您的 childcontrol 中创建一个事件 -
public event TextChangedEventHandler TextChanged;
现在在子控件中为 TextBox 的 TextChanged 事件添加一个处理程序 -
private void TextBox_TextChanged(object sender, TextChangedEventArgs args)
{
if (TextChanged != null)
{
TextChanged.Invoke(this, args);
}
}
还更新此处理程序的 XAML -
<TextBox ... TextChanged="TextBox_TextChanged" ... />
现在,您已经在子控件中创建了一个事件,该事件会在 Textbox 的 textchanged 触发时触发。
现在您只需在主窗口中为此事件添加一个处理程序 -
private void ChildControl_TextChanged(object sender, TextChangedEventArgs args)
{
//TODO: Add your further code here.
}
【讨论】: