Събития в прозорци

управление на прилагането на съобщение на Windows. Това означава, че заявлението е общуването с Windows. на Windows - с приложението чрез предварително зададените съобщения. Тези съобщения са структури, съдържащи различни части от информацията, използвана от приложението и самия Windows, за да се определи какво да прави по-нататък. Преди появата на такива библиотеки като MFC. и среда за развитие като VisualBasic. предприемачът е трябвало да се грижи за това как искате да се справят с входящи съобщения. VisualBasic и .NET увийте някои от тези входящи съобщения в нещо, наречено събития. Ако вашата програма трябва да реагира на конкретна входящо съобщение, което трябва да се справят с едно събитие. Типичен пример за това - когато потребителят кликне върху формата на бутона. В този случай, Windows изпраща съобщение до бутона за боравене със събития WM_MOUSECLICK (понякога се нарича процедурата прозорец или WndProc). За .NET разработчици, тя изглежда като събитието OnClick на един бутон.

В развитието на обектно-ориентирана приложения изискват различна форма на взаимодействие между обектите. Когато някой от сайтовете е нещо интересно, то е вероятно, че други сайтове трябва да бъдат информирани за това. И отново дойде на събитията за помощ. По същия начин, както .NETFramework тайна на съобщенията за Windows, в случай, приложението ви може да се използва събитието като комуникационен посредник между обекти.

Делегатите се използват като средство за формиране на събития, когато съобщенията са получени от приложението.

Един от най-дизайн Предимствата на събитията в C # е, че за тях да се използва, не е необходимо да знае нищо за лежи в основата на делегацията. Ето защо, ние ще започне тази секция с кратка дискусия за събитията от гледна точка на клиентския софтуер. Ние ще се фокусира върху това как да се напише код, за да получавате известия за събития, не се тревожи твърде много за това какво се случва "зад кулисите" - само за да покаже колко е лесно да се работи с действително събития. След това ние ще напиша пример за генериране на събитието, и по този начин, ние ще видим как връзката между събития и делегати.

В този контекст понятието "събитие" се използва в две различни сетива. На първо място, тъй като някои интерес за нас е аварията, и второ - като добре дефинирана цел в C # - обектът, който служи на процеса на уведомяване. Използването на този термин по-нататък, ние ще говорим за това, или като събитие, C #, или когато смисълът е очевидна от контекста - като просто едно събитие.

Представителство на събитието от гледна точка на получателя

Сега, някъде вътре получателят е метод, който е отговорен за обработката на събития. Това събитие манипулатор ще се проведе, когато има събитие, записано за него. И тук идва делегатите. Тъй като подателят няма никаква представа за получателя (ите), не може да има връзка между тях. Делегатите се използват като посредник. Подателят дефинира делегат, който ще се използва от страна на получателя. Получател, регистрира манипулатор събитие. Процесът на поставяне на манипулатор на събитие се нарича свързване събитие. Един прост пример на задължителни мероприятия Кликнете ще ни помогне да се илюстрира този процес.

btnOne.Click + = нов EventHandler (Button_Click);

Когато това се случва, е, че ние информира издръжливостта й, че се случва, когато Кликнете събитие за бутон btnOne. то трябва да се направи метод Button_Click. EventHandler - е делегат, който използва събитието манипулатор за местоназначението (Button_Click) на събитието (клик). Имайте предвид, че ние използвахме + = оператора да добавите метод към списъка на делегати. Всичко това означава, че събитието може да бъде назначен на повече от един процесор. Тъй като това е мултикаст делегат на него всички приложими правила за добавяне на множество методи; Въпреки това няма гаранция, че реда, в който те ще се нарекат. Ние ще продължим по-нататък, влачейки под формата на друг бутон и го преименувайте на btnTwo. Сега ние свързваме случай Кликнете бутони btnTwo с един и същ метод Button_Click. както е показано по-долу:

btnOne.Click + = нов EventHandler (Button_Click);

btnTwo. Кликнете върху + = нов EventHandler (Button_Click);

EventHandler делегат дефинирана среда .NETFramework. Той се намира в пространството от имена System. и всички събития, определени в .NETFramework. го използвате. Както бе споменато по-горе, в списъка на делегатите трябва да имат един и същ подпис. Очевидно е, че това важи и за делегати за събития. Button_Click долу показва определянето на метода:

частен невалидни btnOne_Click (обект подател, EventArgs д)

Вторият вариант - EventArgs - обект, който съдържа други потенциално полезна информация за събитието. Този параметър може да бъде от всякакъв тип, който наследява от EventArgs.

По този начин, на събитието MouseDown използване MouseDownEventArgs. Той съдържа функции като бутона на мишката, че е бил натиснат, Х и Y координатите на индекс, както и друга информация, свързана със събитието. Обърнете внимание на името на модела, която приключва в EventArgs. По-късно ще видим как да създадете и приложите персонализиран обект въз основа на EventArgs.

Също така обърнете внимание на името на метода. В съответствие с установената споразумението, всеки манипулатор събитие трябва да се придържа към "именуване obekt_sobytie" стил.

Тук, на обекта - предмет, който се активира на събитието, а събитието - самото събитие. Това е само една конвенция, но за добро четливост тя трябва да се придържат към кода.

Последното нещо, което да се направи в този пример - добавете малко код, който всъщност прави нещо полезно в манипулатор. Нека не забравяме, че имаме два бутона използват същия процесор. Това е първото нещо, което да се направи - да се определи кои от тях генерира събитието, а след извършване на съответното действие. В този пример, ние просто се получи някакъв текст във формуляра за етикет. За да направите това, плъзнете лентата с инструменти от формата на типа контрол маркер и го наричат ​​lblInfo. След това напишете следния код в Button_Click метода:

ако (((Button) подател) .name == "btnOne")

lblInfo.Text = "натиснат първия бутон";

lblInfo.Text = "е натиснат втория бутон";

Имайте предвид, че тъй като параметър на подателя се изпраща като обект, той трябва Priest от вида на обекта, която е предизвикала случай, в този случай - да Бътън. В този пример, ние използваме името на собствеността да се определи върху бутона, който е причинило събитието. Въпреки това, можете да използвате и други свойства. Той е удобен за използване в този сценарий, на Tag имота. тъй като тя може да се съхранява всичко, което искате да се сложи в него. За да видите как делегатите на групата възможност да работят, добави друг метод за събитието Щракнете върху бутона bthTwo. Ние използваме името на метода, по подразбиране. оформено тяло на строителя сега ще изглежда така:

this.btnOne.Click + = нов System.EventHandler (this.btnOne_Click);

this.btnTwo.Click + = нов System.EventHandler (this.btnOne_Click);

this.btnTwo.Click + = нов System.EventHandler (this.btnTwo_Click);

Ако позволим VisualStudio да създадете свой собствен празен, тогава ние виждаме следния метод, в края на файла източник. Въпреки това, MessageBox на извикване на функция трябва да го добавите ръчно:

частен невалидни btnTwo_Click (обект подател, EventArgs д)

MessageBox.Show ( "Това беше само, когато събитието кликнете върху бутона 2");

Ако се върнем и да използват анонимни методи, техники и Button_Click btnTwo_Click не трябва.

Когато стартирате този пример, кликнете върху текста етикет btnOne Редактиране бутон. Луга върху бутона btnTwo не само ще се промени текста на етикета, но също така показва MessageBox (съобщение кутия) а. Спомнете си за пореден път, че няма гаранция, че промените ще отбележат текста преди MessageBox. така че не се напише специален код за водача.

Може да изглежда, че за да се разбере всичко това, е необходимо да се проучи много понятия, но на практика, в размер на кодиране да се извършва в приемащия е много малък. Трябва също да се има предвид, че събитието на запис мивки вие ще имате много повече, отколкото техните податели. Най-малко по отношение на потребителския интерфейс на Windows. Microsoft вече е разработила всички подателите на събитията, които се нуждаете (те са кодирани в .NET базови класове. Windows.Forms в пространството от имена).