我在表单上有一个用户控件,当我在那个用户控件上鼠标移动时,我想在表单中做一些事情。
我怎样才能让表单“收听”这个事件?
我正在使用 Visual C#、.Net 框架 3.5、winforms
我在表单上有一个用户控件,当我在那个用户控件上鼠标移动时,我想在表单中做一些事情。
我怎样才能让表单“收听”这个事件?
我正在使用 Visual C#、.Net 框架 3.5、winforms
我想您指的是使用控件或类似的东西。
您可以添加一个public event
, 并在检测到内部类事件时在您的类中触发它。
然后您必须订阅第二类中的已发布事件。
这是一个示例,因此您可以看到 sintax:
public class WithEvent
{
// this is the new published event
public EventHandler<EventArgs> NewMouseEvent;
// This handles the original mouse event of the inner class
public void OriginalEventhandler(object sender, EventArgs e)
{
// this raises the published event (if susbcribedby any handler)
if (NewMouseEvent != null)
{
NewMouseEvent(this, e);
}
}
}
public class Subscriber
{
public void Handler(object sender, EventArgs e)
{
// this is the second class handler
}
public void Subscribe()
{
WithEvent we = new WithEvent();
// This is how you subscribe the handler of the second class
we.NewMouseEvent += Handler;
}
}
如果您正在谈论Windows Forms
(从问题中不清楚),您需要在接收鼠标事件的类中定义一个新事件。接收后它会引发一个新的自定义事件。另一个类订阅了那个(自定义事件)接收通知。
萌信息(不是几行就可以呈现的)可以看这里:
如果您在谈论WPF
,事件有不同的概念:事件路由。如果您的类是实际接收鼠标事件的组件的 UI 树中存在的 UI 元素,它也会传播到您的类。所以不需要更多的编码。
为了扩展 JotaBe 的答案,我可以看到您有两种情况:
a) A 类调用 B 类的方法,发生异常。在这种情况下,您不需要做任何事情:异常会遍历堆栈,直到找到一条 catch 语句。所以,真的,你需要做的就是不捕捉异常,或者如果你确实需要捕捉它(用于记录目的等),然后重新抛出它。
b)如果您需要在某些不相关的类中触发代码,由于异常,那么最好的方法是使用事件。在您的班级中声明:
public class ClassA
{
public static event EventHandler<Exception> OnException;
public void Notify(Exception ex)
{
if (OnException != null)
{
OnException(this, ex);
}
}
}
然后,为了得到通知,你只需要
ClassA.OnException += (sender, exeption) =>
{
... some GetHashCode ..
};
...我猜 JotaBe 在我输入时已经添加了所有必要的示例代码