2009-12-21 12 views
10

Biraz kafam karıştı. Özel etkinlik verilerine sahip olabilmek için EventArgs'tan türetilen sınıf oluşturabildiğimi biliyorum. Fakat bir şekilde baz sınıf EventArgs'ı kullanabilir miyim? Fare düğmesi tıklatıldığında, abone yönteminde her zaman "EventArgs e" parametresi bulunur. Bir şekilde veriyi bu şekilde geçirecek bir yöntem oluşturabilir miyim, yani onlar Eventargs üssünden geçecekler mi?Verileri türetilmiş sınıf oluşturmadan EventArgs'a geçirmek mümkün mü?

+0

Bir fare tıklaması olayı, sadece bunu yapamazsınız, tasarımınızda bir sorun olduğunu gösterir. – Will

+1

Bunun neden bir tasarım problemi olduğunu açıklığa kavuşturma şansı var mı? Bir menü, bir düğme yığını olarak semantik olarak görüntülenemez, ilgili olay hangi menüde gerçekten 'button' düğmesine basıldığını sormanıza izin verir mi? Bir buton tıklamasıyla birlikte ekstra bilgi iletmek isteyerek hangi tasarım prensibini kırıyorsunuz? – Patrick

cevap

3

EventArgs Veri türü raw'i kullanmak mümkün mü? Kesinlikle. MSDN göre: Hiç

This class contains no event data; it is used by events that do not pass state information to an event handler when an event is raised. If the event handler requires state information, the application must derive a class from this class to hold the data.

http://msdn.microsoft.com/en-us/library/system.eventargs.aspx

private event TestEventEventHandler TestEvent; 
    private delegate void TestEventEventHandler(EventArgs e); 

    private void button1_Click(object sender, EventArgs e) 
    { 
     TestEvent += TestEventHandler; 
     if (TestEvent != null) 
     { 
      TestEvent(new EventArgs()); 
     } 
    } 
    private void TestEventHandler(EventArgs e) 
    { 
     System.Diagnostics.Trace.WriteLine("hi"); 
    } 

yapmalı mıyız? Herhangi bir sebepten dolayı düşünemiyorum eğer. Kendi tıklama oluşturmak isterseniz sadece çok kendi başınıza MouseEventArgs örneğini:

MouseEventArgs m = new MouseEventArgs(System.Windows.Forms.MouseButtons.Left, 1, 42, 42, 1); 
+4

Ayrıca, EventArgsEmpty'yi kullanabilirsiniz http://msdn.microsoft.com/en-us/library/system.eventargs.empty.aspx – Gavin

+0

Bu bir yazım hatası mı? 'TestEventEventHandler'. İki Etkinlik kelimesi var. Ama kodda. TestEventHandler'ı kullandın. – Bigeyes

5

Hayır. EventArgs temel sınıfı, bazı standart olay temsilci türlerine izin vermenin bir yoludur. Sonuçta, verileri bir işleyiciye iletmek için, EventArgs alt sınıfını almanız gerekir. Bunun yerine gönderici argümanını kullanabilirsiniz, ancak bu gerçekten olayı tetikleyen nesne olmalıdır.

13

Sen Genel Türleri yaklaşımla EventArgs sınıfını kullanabilirsiniz. gerek yok, Yani

anyElement.SizeRectChanged += OnSizeRectChanged; 

public void OnSizeRectChanged(object sender, Rect e){ 
    //TODO abything using the Rect class 
    e.Left = e.Top = e.Width = e.Height = 50; 
} 

: olay Dinleme

if(SizeRectChanged != null){ 
    Rect r = new Rect(0,0,0,0); 
    SizeRectChanged(this,r); 
} 

:

public EventHandler<Rect> SizeRectChanged; 

olayı Raising: Bu örnekte, i dönüş türü olarak Rect sınıfını ile kullanacağı yeni etkinlik sınıfları veya delegeler oluşturmak için, yalnızca belirli bir türden geçen bir EventHandler öğesi oluşturun.

+1

Bu yanlış görünüyor. [MSDN web sitesi örneği] (http://msdn.microsoft.com/en-us/library/db0etb8x%28v=vs.110%29.aspx), Rect veya TEventArg'ın EventArgs'tan devralması gerektiğini gösterir. Yanlış anlamadığım bir şey olmadığı sürece. –

+1

Thomas, ben de bu kafa karıştırıcıyı buldum. Ama Jupi'nin önerisi benim için çalıştı. –

+0

Wow ... keşke bunu uzun zaman önce biliyordum. EventHandler bildirdiğinizde, T'nin EventArgs'dan türetilmesi gerektiğini her zaman varsaydım. Örneğin, olayımla bir dize göndermem gerekirse, EventArgs'tan alt sınıflara ayrılmış yeni bir sınıf StringEventArgs yapardım. Thomas Lann tarafından bağlanan MSDN dokümanı, "İkinci parametresi, EventArgs türünden türetilmiştir ve olay verilerini saklar" diyerek, çoğu okuyucuya herhangi bir keyfi sınıfı kullanamayacağınızı ima eder. Ancak derleyici bir EventHandler akla gelir gibi görünmüyor ve bu bana söyleyebileceğim kadar ince çalışıyor. – uglycoyote

İlgili konular