Evenimente în ferestre

mesaj de control aplicație Windows. Acest lucru înseamnă că aplicația comunică cu Windows. Windows - cu aplicația prin mesaje predefinite. Aceste mesaje sunt structuri care conțin diferite informații utilizate de aplicație și Windows în sine, în scopul de a determina ce să facă în continuare. Înainte de apariția bibliotecilor, cum ar fi MFC. și medii de dezvoltare, cum ar fi VisualBasic. dezvoltatorul a trebuit să aibă grijă de modul în care doriți să se ocupe de mesaje primite. VisualBasic și .NET înveliți unele dintre aceste mesaje primite în evenimente ceva numit. În cazul în care programul trebuie să reacționeze la mesajul de intrare specifice, trebuie să se ocupe de un eveniment. Un exemplu comun de acest lucru - atunci când utilizatorul face clic pe butonul de forma. În acest caz, Windows trimite un mesaj la butonul de tratare a evenimentului WM_MOUSECLICK (uneori numita procedură de fereastră, sau WndProc). Pentru dezvoltatori .NET, se pare ca evenimentul OnClick a unui buton.

În dezvoltarea de aplicații orientate spre obiect necesită o altă formă de interacțiune între obiecte. Când unul dintre site-urile dvs. este ceva interesant, este probabil ca alte site-uri ar trebui să fie informat cu privire la aceasta. Și încă o dată ajuns la evenimentele de ajutor. În același mod ca și .NETFramework împachetări mesajele de Windows în caz, aplicația poate utiliza evenimentul ca intermediar de comunicare între obiecte.

Delegații sunt folosite ca un mijloc de formare a evenimentelor atunci când mesajele sunt primite de către aplicație.

Unul dintre avantajele de proiectare ale evenimentelor în C # este că, pentru ei de a utiliza nu este necesar să se știe nimic despre mecanismul de bază al delegației. Prin urmare, vom începe această secțiune cu o scurtă discuție despre evenimentele din perspectiva software-ul client. Ne vom concentra pe modul de a scrie cod pentru a primi notificări despre evenimente, nu vă faceți griji prea mult despre ceea ce se întâmplă „în spatele scenei“ - doar pentru a arăta cât de ușor efectiv de lucru cu evenimente. După aceea, vom scrie un exemplu de generare a evenimentului, și în acest sens, vom vedea modul în care relația dintre evenimente și delegați.

În acest context, termenul „eveniment“ este folosit în două sensuri diferite. În primul rând, ca un oarecare interes pentru noi este accident, și în al doilea rând - ca un obiect bine definit în C # - obiectul care servește procesul de notificare. Folosind acest termen în continuare, vom vorbi despre ea, sau ca un eveniment, C #, sau atunci când sensul este evident din context - ca pur si simplu un eveniment.

Reprezentarea evenimentului din perspectiva beneficiarului

Acum, undeva în interiorul destinatarului este o metodă care este responsabil pentru manipularea evenimentelor. Acest handler eveniment va fi rulat de fiecare dată când există un eveniment înregistrat pentru el. Și aici vine delegații. Deoarece expeditorul nu are nici o idee despre destinatarul (e), nu poate exista o legătură între ele. Delegații sunt utilizate în calitate de mediator. Expeditorul definește un delegat care va fi utilizat de către destinatar. Destinatar, înregistrează o tratare a evenimentului. Procesul de atașare a handler unui eveniment este numit un eveniment obligatoriu. Un exemplu simplu de evenimente de legare ne va ajuta să faceți clic ilustra acest proces.

btnOne.Click + = new EventHandler (Button_Click);

Când acest lucru se întâmplă este că ne informează runtime care apare atunci când clic pe butonul pentru evenimentul btnOne. ar trebui să fie metoda Button_Click. EventHandler - este un delegat care utilizează de tratare a evenimentelor pentru destinația (Button_Click) evenimentului (clic). Rețineți că am utilizat + = operator pentru a adăuga o metodă pe lista delegaților. Toate acestea înseamnă că evenimentul poate fi atribuit mai mult de un procesor. Deoarece acesta este un delegat multicast pentru el toate regulile aplicabile cu privire la adăugarea mai multor metode; Cu toate acestea nu există nici o garanție că ordinea în care acestea vor fi numite. Vom continua în continuare, trăgând în forma unui alt buton, și redenumiți-l la btnTwo. Acum asociem evenimentul faceți clic pe butoanele btnTwo cu aceeași metodă Button_Click. așa cum se arată mai jos:

btnOne.Click + = new EventHandler (Button_Click);

btnTwo. Dați clic pe + = new EventHandler (Button_Click);

EventHandler delegat .NETFramework mediu definit. Acesta este situat în spațiul de nume de sistem. și toate evenimentele definite în .NETFramework. l utilizați. După cum sa menționat mai sus, lista delegaților ar trebui să aibă aceeași semnătură. Evident, acest lucru este valabil și pentru delegați eveniment. Button_Click de mai jos arată definiția metodei:

privat void btnOne_Click (expeditor obiect, EventArgs e)

A doua opțiune - EventArgs - un obiect care conține alte informații potențial utile despre eveniment. Acest parametru poate fi de orice tip, care moștenește de la EventArgs.

Astfel, evenimentul MouseDown folosind MouseDownEventArgs. Acesta conține caracteristici, cum ar fi butonul mouse-ului, care a fost apăsat, X și Y coordonatele index, precum și alte informații legate de eveniment. Notați numele modelului, care se încheie la EventArgs. Mai târziu vom vedea cum să creați și să aplice un obiect personalizat pe baza EventArgs.

De asemenea, să acorde o atenție la numele metodei. Conform acordului stabilit, orice tratare a evenimentului trebuie să adere la „numirea obekt_sobytie“ stilul.

Aici, obiectul - un obiect care declanșează evenimentul, iar evenimentul - evenimentul în sine. Aceasta este doar o convenție, dar pentru a fi citite de bună ar trebui să adere la codul.

Ultimul lucru de făcut în acest exemplu - adăugați un cod care face de fapt ceva util în handler. Să ne amintim că avem două butoane sunt utilizând același procesor. Acesta este primul lucru de făcut - pentru a determina care dintre ele a generat evenimentul, iar apoi efectuați acțiunea corespunzătoare. În acest exemplu, vom obține pur și simplu un text de pe formularul de etichetă. Pentru a face acest lucru, trageți bara de instrumente de forma de tipul de etichetă de control și numesc lblInfo. Apoi scrie următorul cod în metoda Button_Click:

if (((buton) expeditor) .name == "btnOne")

lblInfo.Text = „apasat primul buton“;

lblInfo.Text = „este apăsat al doilea buton“;

Rețineți că, deoarece parametrul expeditor este trimis ca un obiect, acesta trebuie să Priest tipul de obiect care a cauzat evenimentul, în acest caz - Button. În acest exemplu, vom folosi proprietatea Name pentru a determina butonul care a cauzat evenimentul. Cu toate acestea, puteți utiliza alte proprietăți. Este convenabil să se utilizeze în acest scenariu, proprietatea Tag. deoarece poate stoca orice doriți să-l pună în. Pentru a vedea modul în care delegații de grup oportunitatea de a lucra, se adaugă o altă metodă pentru evenimentul Faceți clic pe butonul bthTwo. Noi folosim numele metodei implicite. corp în formă de constructor va arăta acum astfel:

this.btnOne.Click + = new System.EventHandler (this.btnOne_Click);

this.btnTwo.Click + = new System.EventHandler (this.btnOne_Click);

this.btnTwo.Click + = new System.EventHandler (this.btnTwo_Click);

Dacă permitem VisualStudio pentru a crea propriul gol, atunci vom vedea următoarea metodă, la sfârșitul fișierului sursă. Cu toate acestea, messageBox funcție de apel trebuie să-l adăugați manual:

privat void btnTwo_Click (expeditor obiect, EventArgs e)

MessageBox.Show ( „A fost doar atunci când faceți clic pe butonul eveniment 2“);

Dacă te duci înapoi și de a folosi metode anonime, tehnici și Button_Click btnTwo_Click nu au nevoie.

Când executați acest exemplu, faceți clic pe butonul Editați textul etichetei btnOne. Lye pe butonul btnTwo nu se va schimba numai textul etichetei, dar, de asemenea, afișează un MessageBox (casetă de mesaj). Să ne amintim încă o dată că nu există nici o garanție că modificările vor marca textul înainte de messageBox. asa ca nu scrie cod specific handler.

Poate părea că pentru a înțelege toate acestea, este necesar de a explora multe concepte, dar, în practică, cantitatea de codificare care urmează să fie efectuată la receptor este foarte mic. De asemenea, trebuie avut în vedere faptul că evenimentul a scrie afundă va avea mult mai mult decât expeditorii lor. cel puțin în ceea ce privește interfața de utilizator Windows At. Microsoft a dezvoltat deja toate expeditorii de evenimentele de care aveți nevoie (acestea sunt codificate în clasele de bază .NET. Windows.Forms în spațiul de nume).