我有 3 个类,一个类触发事件,另一个类调用事件处理程序发送方,最后最后一个类接收事件。然而,发送方类中的事件处理程序总是null
的,因此接收方从不处理事件。我无法弄清楚为什么它null
,因为我将其分配为如下所示的StartEventHandler
。
我尝试输入调试语句以查看为什么处理程序从未运行过,并发现它永远不会到达 C 类。
头等舱触发事件:
Class A {
public void Button_Click(object sender, RoutedEventArgs e)
{
B senders = new B();
senders.OnPageSwap(new StartEventArgs());
}
}
第二类是发件人
public delegate void StartEventHandler(object sender, StartEventArgs e);
public class B
{
public event StartEventHandler PageSwap;
public virtual void OnPageSwap(StartEventArgs e)
{
Console.WriteLine("Entered PageSwapSender");
if(PageSwap != null) PageSwap(this, e);
}
}
三等是接收者
Class C {
B sender = new B();
void Connect()
{
sender.PageSwap += new StartEventHandler(this.sender_PageSwap);
Console.WriteLine("Entered Connect");
}
private void sender_PageSwap(object sender, StartEventArgs e)
{
Console.WriteLine("Entered Handler");
}
}
谁能告诉我为什么class B
中的PageSwap
总是null
因此永远不会运行PageSwap(this, e)
.
代码的问题在于您正在实例化类B
的两个单独实例。A
您尝试在B
的一个实例上引发事件。C
您正在尝试处理使用 B
的不同实例引发的事件。
似乎您试图通过在 C
中创建 Connect
方法来做正确的事情,但这是您应该将现有的 B
实例传递给 C
的地方。
如果你像这样编写代码,它就会起作用:
class A
{
public void Button_Click(object sender, RoutedEventArgs e)
{
B senders = new B();
C c = new C();
c.Connect(senders);
senders.OnPageSwap(new StartEventArgs());
}
}
public delegate void StartEventHandler(object sender, StartEventArgs e);
public class B
{
public event StartEventHandler PageSwap;
public virtual void OnPageSwap(StartEventArgs e)
{
Console.WriteLine("Entered PageSwapSender");
if (PageSwap != null) PageSwap(this, e);
}
}
class C
{
public void Connect(B sender)
{
sender.PageSwap += new StartEventHandler(this.sender_PageSwap);
Console.WriteLine("Entered Connect");
}
private void sender_PageSwap(object sender, StartEventArgs e)
{
Console.WriteLine("Entered Handler");
}
}
C.Connect()
没有被调用,它需要被调用,因为它是你注册调用this.sender_PageSwap
的事件处理程序的地方。没有这一点,什么都不会发生。