【问题标题】:How to handle child event in parent control如何处理父控件中的子事件
【发布时间】:2011-11-24 14:44:48
【问题描述】:

在我的主窗口中,我有一个包含文本框的子控件(用户控件)。如何处理主(父)窗口中子控件文本框的textchange事件。

由于我是事件路由的新手,请提供一些代码示例。

【问题讨论】:

    标签: wpf events event-handling routing event-bubbling


    【解决方案1】:

    您应该能够从父控件中挂钩事件。但是由于您的父控件没有自己的 TextChanged 事件,您需要使用附加属性语法:

    <Window ...
            TextBox.TextChanged="ChildTextBoxChanged">
    

    在你的代码隐藏中:

    private void ChildTextBoxChanged(object sender, TextChangedEventArgs args)
    {
        ...
    }
    

    您不必特别将TextBox.TextChanged= 放在Window 上——只要是TextBox 的父级控件,即UserControl 的父级控件即可。该事件将依次冒泡到每个父母,一直到顶级Window,并且可以在沿途的任何地方处理。

    (请注意,如果有人挂钩事件并设置 e.Handled = true,则事件不会冒泡超过该点。了解您是否有多个级别的处理程序很有用。)

    【讨论】:

    【解决方案2】:

    这也帮助了我。我将在子控件的容器中有一个事件,并在代码隐藏文件中定义该事件。该事件将处理所有孩子的所有文本更改事件。

           <StackPanel TextBoxBase.TextChanged="test_TextChanged" Name="test">                                    
                    <userControl/>
           </StackPanel>
    

    【讨论】:

      【解决方案3】:

      在您的 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.
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多