我如何在C#中制作自己的活动?
如何在C#中创建自己的事件?您可以使用以下代码声明事件:我如何在C#中制作自己的活动?,c#,.net,events,C#,.net,Events,如何在C#中创建自己的事件?您可以使用以下代码声明事件: public event EventHandler MyOwnEvent; 如果需要,可以使用自定义委托类型而不是EventHandler 您可以在文章(MSDN)中找到有关在.NET中使用事件的详细信息/教程。我的文章中对事件和委托进行了全面讨论。对于最简单的事件类型,您只需声明一个公共事件,编译器将创建一个事件和一个字段来跟踪订阅者: public event EventHandler Foo; 如果您需要更复杂的订阅/取消订阅逻
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!}我总是忘记为类写事件部分。这个答案的关键区别在于使事件成为静态的,这样就可以在不需要引用触发事件的对象的情况下接收事件。非常适合订阅来自多个独立控件的事件。