1

我在表单上有一个用户控件,当我在那个用户控件上鼠标移动时,我想在表单中做一些事情。

我怎样才能让表单“收听”这个事件?

我正在使用 Visual C#、.Net 框架 3.5、winforms

4

3 回答 3

4

我想您指的是使用控件或类似的东西。

您可以添加一个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;
        }

    }
于 2012-05-07T17:33:24.723 回答
1

如果您正在谈论Windows Forms(从问题中不清楚),您需要在接收鼠标事件的类中定义一个新事件。接收后它会引发一个新的自定义事件。另一个类订阅了那个(自定义事件)接收通知。

萌信息(不是几行就可以呈现的)可以看这里:

如何将事件传播到 MainForm?

如果您在谈论WPF,事件有不同的概念:事件路由。如果您的类是实际接收鼠标事件的组件的 UI 树中存在的 UI 元素,它也会传播到您的类。所以不需要更多的编码。

于 2012-05-07T17:32:28.200 回答
1

为了扩展 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 在我输入时已经添加了所有必要的示例代码

于 2012-05-07T17:44:03.203 回答