我如何在C#中制作自己的活动?

我如何在C#中制作自己的活动?,c#,.net,events,C#,.net,Events,如何在C#中创建自己的事件?您可以使用以下代码声明事件: public event EventHandler MyOwnEvent; 如果需要,可以使用自定义委托类型而不是EventHandler 您可以在文章(MSDN)中找到有关在.NET中使用事件的详细信息/教程。我的文章中对事件和委托进行了全面讨论。对于最简单的事件类型,您只需声明一个公共事件,编译器将创建一个事件和一个字段来跟踪订阅者: public event EventHandler Foo; 如果您需要更复杂的订阅/取消订阅逻

如何在C#中创建自己的事件?

您可以使用以下代码声明事件:

public event EventHandler MyOwnEvent;
如果需要,可以使用自定义委托类型而不是EventHandler


您可以在文章(MSDN)中找到有关在.NET中使用事件的详细信息/教程。

我的文章中对事件和委托进行了全面讨论。对于最简单的事件类型,您只需声明一个公共事件,编译器将创建一个事件和一个字段来跟踪订阅者:

public event EventHandler Foo;
如果您需要更复杂的订阅/取消订阅逻辑,您可以明确地执行以下操作:

public event EventHandler Foo
{
    add
    {
        // Subscription logic here
    }
    remove
    {
        // Unsubscription logic here
    }
}

下面是一个使用C创建和使用事件的示例#

使用系统;
名称空间事件\u示例
{
//首先,我们必须定义一个代理,它充当
//触发事件时最终调用的函数。
//您会注意到第二个参数是MyEventArgs类型。
//此对象将包含有关触发事件的信息。
公共委托void MyEventHandler(对象源,MyEventArgs e);
//这是一个向接收事件的类描述事件的类。
//EventArgs类必须始终从System.EventArgs派生。
公共类MyEventArgs:EventArgs
{
私有字符串EventInfo;
公共MyEventArgs(字符串文本)
{
事件信息=文本;
}
公共字符串GetInfo()
{
返回事件信息;
}
}
//下一个类是包含事件并触发它的类
//一旦执行了一个操作。例如,让我们触发此事件
//一旦一个变量在一个特定的值上递增
//事件使用MyEventHandler委托创建签名
//对于被调用的函数。
公共类MyClass
{
最大值上的公共事件MyEventHandler;
私人互联网i;
私人int最大值=10;
公共整数MyValue
{
得到
{
返回i;
}
设置
{

如果(值要这样做,我们必须知道三个组成部分

  • 负责触发事件的地点
  • 负责
    响应事件的地点
  • 事件本身

    a、 事件

    b.事件参数

    c、 EventArgs枚举

  • 现在,让我们创建调用函数时激发的事件

    但我会按照这样的顺序来解决这个问题:我在创建类之前使用它

  • 负责
    响应事件的地点

    NetLog.OnMessageFired += delegate(object o, MessageEventArgs args) 
    {
            // when the Event Happened I want to Update the UI
            // this is WPF Window (WPF Project)  
            this.Dispatcher.Invoke(() =>
            {
                LabelFileName.Content = args.ItemUri;
                LabelOperation.Content = args.Operation;
                LabelStatus.Content = args.Status;
            });
    };
    
    //this is the sender object, MessageEventArgs Is a class I want to create it  and Operation and Status are Event enums
    NetLog.FireMessage(this, new MessageEventArgs("File1.txt", Operation.Download, Status.Started));
    downloadFile = service.DownloadFile(item.Uri);
    NetLog.FireMessage(this, new MessageEventArgs("File1.txt", Operation.Download, Status.Finished));
    
  • NetLog是一个静态类,我稍后会解释它

    下一步是

  • 负责触发事件的地点

    NetLog.OnMessageFired += delegate(object o, MessageEventArgs args) 
    {
            // when the Event Happened I want to Update the UI
            // this is WPF Window (WPF Project)  
            this.Dispatcher.Invoke(() =>
            {
                LabelFileName.Content = args.ItemUri;
                LabelOperation.Content = args.Operation;
                LabelStatus.Content = args.Status;
            });
    };
    
    //this is the sender object, MessageEventArgs Is a class I want to create it  and Operation and Status are Event enums
    NetLog.FireMessage(this, new MessageEventArgs("File1.txt", Operation.Download, Status.Started));
    downloadFile = service.DownloadFile(item.Uri);
    NetLog.FireMessage(this, new MessageEventArgs("File1.txt", Operation.Download, Status.Finished));
    
  • 第三步

  • 事件本身
  • 我在一个名为NetLog的类中扭曲了事件

    public sealed class NetLog
    {
        public delegate void MessageEventHandler(object sender, MessageEventArgs args);
    
        public static event MessageEventHandler OnMessageFired;
        public static void FireMessage(Object obj,MessageEventArgs eventArgs)
        {
            if (OnMessageFired != null)
            {
                OnMessageFired(obj, eventArgs);
            }
        }
    }
    
    public class MessageEventArgs : EventArgs
    {
        public string ItemUri { get; private set; }
        public Operation Operation { get; private set; }
        public Status Status { get; private set; }
    
        public MessageEventArgs(string itemUri, Operation operation, Status status)
        {
            ItemUri = itemUri;
            Operation = operation;
            Status = status;
        }
    }
    
    public enum Operation
    {
        Upload,Download
    }
    
    public enum Status
    {
        Started,Finished
    }
    
    此类现在包含
    事件
    事件参数
    事件参数枚举
    以及
    负责触发事件的函数


    很抱歉回答了这么长的问题

    我不确定如何从代码中调用该事件,但事实证明这是非常明显的。您只需将其作为传递sender和EventArgs对象的方法来调用即可。[即if(fooOccessed)Foo(sender,EventArgs);]@Richard:不完全是这样;你需要处理没有订阅者的情况,因此委托引用将为空。期待着你链接的文章中关于线程安全事件的C#4更新。真是太棒了,@JonSkeet!在浏览了100个解释之后,这终于帮助我理解了。SE是对的,帖子仍然相关好几年了。{Meh!}我总是忘记为类写
    事件部分。这个答案的关键区别在于使事件成为静态的,这样就可以在不需要引用触发事件的对象的情况下接收事件。非常适合订阅来自多个独立控件的事件。