Bagaimana saya bisa membuat acara saya sendiri di C #?


122

Bagaimana saya bisa membuat acara saya sendiri di C #?

Jawaban:


217

Berikut contoh membuat dan menggunakan acara dengan C #

using System;

namespace Event_Example
{
    //First we have to define a delegate that acts as a signature for the
    //function that is ultimately called when the event is triggered.
    //You will notice that the second parameter is of MyEventArgs type.
    //This object will contain information about the triggered event.
    public delegate void MyEventHandler(object source, MyEventArgs e);

    //This is a class which describes the event to the class that recieves it.
    //An EventArgs class must always derive from System.EventArgs.
    public class MyEventArgs : EventArgs
    {
        private string EventInfo;
        public MyEventArgs(string Text)
        {
            EventInfo = Text;
        }
        public string GetInfo()
        {
            return EventInfo;
        }
    }

    //This next class is the one which contains an event and triggers it
    //once an action is performed. For example, lets trigger this event
    //once a variable is incremented over a particular value. Notice the
    //event uses the MyEventHandler delegate to create a signature
    //for the called function.
    public class MyClass
    {
        public event MyEventHandler OnMaximum;
        private int i;
        private int Maximum = 10;
        public int MyValue
        {
            get
            {
                return i;
            }
            set
            {
                if(value <= Maximum)
                {
                    i = value;
                }
                else
                {
                    //To make sure we only trigger the event if a handler is present
                    //we check the event to make sure it's not null.
                    if(OnMaximum != null)
                    {
                        OnMaximum(this, new MyEventArgs("You've entered " +
                            value.ToString() +
                            ", but the maximum is " +
                            Maximum.ToString()));
                    }
                }
            }
        }
    }

    class Program
    {
        //This is the actual method that will be assigned to the event handler
        //within the above class. This is where we perform an action once the
        //event has been triggered.
        static void MaximumReached(object source, MyEventArgs e)
        {
            Console.WriteLine(e.GetInfo());
        }

        static void Main(string[] args)
        {
            //Now lets test the event contained in the above class.
            MyClass MyObject = new MyClass();
            MyObject.OnMaximum += new MyEventHandler(MaximumReached);

            for(int x = 0; x <= 15; x++)
            {
                MyObject.MyValue = x;
            }

            Console.ReadLine();
        }
    }
}

4
Setelah mengunjungi ratusan penjelasan, ini akhirnya membantu saya untuk mengerti. SE benar, tulisan yang masih relevan setelah beberapa tahun.

1
{Meh!} Saya selalu lupa menulis di eventbagian untuk kelas.
jp2code

51

Saya memiliki diskusi lengkap tentang acara dan delegasi di artikel acara saya . Untuk jenis acara yang paling sederhana, Anda cukup mendeklarasikan acara publik dan kompilator akan membuat acara dan bidang untuk melacak pelanggan:

public event EventHandler Foo;

Jika Anda memerlukan logika berlangganan / berhenti berlangganan yang lebih rumit, Anda dapat melakukannya secara eksplisit:

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

1
Saya tidak yakin bagaimana memanggil acara dari kode saya, tetapi ternyata sangat jelas. Anda cukup menyebutnya seperti metode yang meneruskannya sebagai pengirim dan objek EventArgs. [yaitu. if (fooHappened) Foo (pengirim, eventArgs); ]
Richard Garside

2
@ Richard: Kurang tepat; Anda perlu menangani kasus di mana tidak ada pelanggan, jadi referensi delegasi akan menjadi nol.
Jon Skeet

Menantikan pembaruan C # 4 tentang peristiwa aman utas di artikel yang Anda tautkan. Kerja yang sangat bagus, @JonSkeet!
kdbanman

20

Anda dapat mendeklarasikan sebuah acara dengan kode berikut:

public event EventHandler MyOwnEvent;

Jenis delegasi kustom, bukan EventHandler, dapat digunakan jika diperlukan.

Anda dapat menemukan informasi / tutorial rinci tentang penggunaan acara di .NET di artikel Tutorial Acara (MSDN).


4

untuk melakukannya kita harus mengetahui tiga komponen

  1. tempat yang bertanggung jawab firing the Event
  2. tempat yang bertanggung jawab responding to the Event
  3. Acara itu sendiri

    Sebuah. Peristiwa

    b. EventArgs

    c. Pencacahan EventArgs

sekarang mari kita buat Peristiwa yang diaktifkan saat fungsi dipanggil

tapi saya urutan saya untuk memecahkan masalah ini seperti ini: Saya menggunakan kelas sebelum saya membuatnya

  1. tempat yang bertanggung jawab responding to the Event

    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;
            });
    };

NetLog adalah kelas statis yang akan saya jelaskan nanti

langkah selanjutnya adalah

  1. tempat yang bertanggung jawab firing the Event

    //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));

langkah ketiga

  1. Acara itu sendiri

Saya mengubah The Event dalam kelas yang disebut 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
}

kelas ini sekarang mengandung the Event, EventArgsdan EventArgs Enumsdan the functionbertanggung jawab untuk menembak acara

maaf untuk jawaban panjang ini


Perbedaan utama dalam jawaban ini adalah membuat peristiwa menjadi statis, yang memungkinkan peristiwa diterima tanpa memerlukan referensi ke objek yang mengaktifkan peristiwa tersebut. Sangat bagus untuk berlangganan acara dari beberapa kontrol independen.
Radderz
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.