Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 从用户控件传递事件';s儿童控制-最直接的方式?_.net_Wpf_Events_User Controls - Fatal编程技术网

.net 从用户控件传递事件';s儿童控制-最直接的方式?

.net 从用户控件传递事件';s儿童控制-最直接的方式?,.net,wpf,events,user-controls,.net,Wpf,Events,User Controls,我的UserControl包含一个按钮。我希望按钮的单击事件直接“通过”传递给用户控件的用户。他们会将其视为一个名为“ButtonClick”的事件 public event RoutedEventHandler ButtonClick { add { _button.Click += value; } remove { _button.Click -= value; } } 这种方法行不通。我确实在客户端代码中添加了ButtonClick的处理程序,但是单

我的UserControl包含一个按钮。我希望按钮的单击事件直接“通过”传递给用户控件的用户。他们会将其视为一个名为“ButtonClick”的事件

public event RoutedEventHandler ButtonClick  
{  
    add { _button.Click += value; }  
    remove { _button.Click -= value; }  
}  
这种方法行不通。我确实在客户端代码中添加了ButtonClick的处理程序,但是单击按钮不会在那里调用它


我可能错过了一些简单的东西,因为我对WPF还是新手。

按钮单击事件是一个路由事件,这意味着它在应用程序的可视树中上下移动,这意味着按钮的任何父级都可以处理此事件。因此,您不必添加自己的逻辑来支持这一点,即您的代码是冗余的

有关如何注册此路由事件的处理程序,请参见以下内容:


Colin E.

您必须注册RoutedEvent:

public static readonly RoutedEvent ButtonClickEvent = EventManager.RegisterRoutedEvent(
    "ButtonClick", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyUserControl));
。。然后使用该属性管理新注册的事件处理程序

public event RoutedEventHandler ButtonClick
    {
        add { AddHandler(ButtonClickEvent , value); } 
        remove { RemoveHandler(ButtonClickEvent , value); }
    }
然后,当触发按钮的单击事件时,显然需要引发Routed事件:

void button_Click(object sender, EventArgs e)
{
   RaiseEvent(new RoutedEventArgs(ButtonClickEvent));
}

从直接连接到按钮的本机事件处理程序只需几个步骤,但并不可怕。

但是,任何父级(默认情况下)都可以访问这些内部信息,这不是很奇怪吗?此外,UserControl位于另一个程序集中。当然,如果这能奏效,我的问题就解决了。谢谢。它就是不起作用,因为我说的是用户控件,你可能错过了。投票否决?(因为我不能)这并不像我希望的那样直接。