Sunteți pe pagina 1din 27

Curs 3

Evenimente Rutate
Comenzi WPF
Data Binding
Lect. dr. Florina Covaci
Eveniment WPF?
• Eveniment: un mesaj trimis de către un obiect la care
programul răspunde prin executarea unei bucăți de
cod

• Evenimentele pot fi lansate de către controale sau alte


părți ale interfeței utilizator
Tipuri de evenimente

•Directe – evenimentul este declansat si


gestionat de obiectul de origine
•Bubbling – de la obiectul de origine catre
nivelurile superioare din arborele de obiecte
•Tunneling – de la elementul parinte (ex.
Window) catre obiectul de origine
Evenimente rutate

• Rafinarea modelului standard de gestiune a evenimentelor astfel incat


acestea sa poata fi procesata intr-o maniera care sa corespunda
structurii arborescente a controalelor

• Modelul propaga automat un eveniment (sus/jos) intr-un arbore de


obiecte, executand handerul de eveniment corespunzator
Evenimente rutate
• un eveniment creat de către un control să apară la un alt control
dintre containerele in care stă controlul sursă

• Se permite astfel programatorului să decidă nivelul la care va prinde


evenimentul lansat in interfața grafică

• Se simplifică scrierea codului si se asigură consistență la tratarea


evenimentelor
Evenimente Bubbling
Evenimente Bubbling
• Sunt aruncate de către controalele unde iși au originea și apoi de
către fiecare control container in care rezidă controlul de origine

• Evenimentele sunt prinse si tratate mai intâi la control și apoi la


containerul care il conține

• Permit unui grup complex de obiecte sa se comporte ca un singur


element
Evenimente de tip tunel
Evenimente de tip tunel

• Actioneaza invers ca si evenimentele bubbling


• Este aruncat mai intâi de către cel mai de sus container din arborele vizual si apoi in
jos de către fiecare container până la controlul de origine
• Permit ca evenimentele să fie prinse si tratate mai intâi la container si apoi la control
• Astfel de evenimente sunt marcate cu cuvantul Preview (PreviewKeyDown,
PreviewMouseDown)
• Evenimentele de tip tunel sunt definite in pereche cu cate un eveniment bubbling
• Mai intâi se aruncă evenimentul de tip tunel si apoi cel bubbling
• Argumentele sunt partajate intre aceste evenimente
RoutedEventArgs
• Fiecare eveniment include o instanță a clasei RoutedEventArgs (sau o clasă care mosteneste
RoutedEventArgs)
• Aceasta conține informație despre eveniment si sursa acestuia

Proprietăți ale RoutedEventArgs


• Handled: dacă evenimentul a fost tratat deja sau nu. Prin setarea la True se poate opri tratarea
ulterioară a evenimentelor de tip bubbling sau tunel
• OriginalSource: se obtine obiectul care a aruncat prima dată evenimentul (diferit de Source la
controale compozite)
• Source: obiectul care a aruncat evenimentul
• RoutedEvent: returnează evenimentul care a fost ridicat. Se foloseste atunci cand printr-un
handler se gestionează mai multe evenimente si dorim sa identificam care eveniment a fost
ridicat
Atașarea unui handler de evenimente
• Se poate face direct in codul XAML prin atasarea numelui metodei la eveniment
<Button Height="23" Margin="132,80,70,0" Name="button1"
VerticalAlignment="Top" Click="button1_Click">Button</Button>
• Evenimente attached: pentru un control se poate atasa un handler unui eveniment care
nu poate fi aruncat de către controlul respectiv
<Grid Button.Click="button_Click">
<Button Height="23" Margin="132,80,70,0" Name="button1"
VerticalAlignment="Top" >Button</Button>
</Grid>
• Codul de mai sus defineste handler pentru toate butoanele din grid
Tratarea unui eveniment de tip tunel sau bubbling

• Pentru a inhiba tratarea unui eveniment de tip tunel sau bubbling


la un anumit nivel in ierarhie, se foloseste proprietatea Handled
setata pe True

• Dacă se setează Handled la un eveniment de tip tunel, atunci se


consideră Handled si evenimentul bubbling pereche
Evenimente la nivel de aplicație
• Fiecare aplicație WPF este incapsulată intr-un obiect de tip Application care furnizează
un set de evenimente pentru gestiunea ciclului de viață al aplicație
• Evenimente la nivel de aplicație
• Activated: apare cand aplicația primeste focus de la un alt program (trecem de la o
alta aplicatie la programul nostru)
• Deactivated: cand aplicatia lasă focusul unui alt program
• DispatcherUnhandledException: apare cand o excepție nu este tratată in aplicație.
Se poate gestiona o exceptie negestionată prin setarea
DispatcherUnhandledExceptionEventArgs.Handled la True
• Exit: apare cand aplicația este inchisă
• SessionEnding: cand se inchide sesiunea Windows adică la logoff sau computer
shutdown
• Startup: cand aplicația este pornită
Crearea unui handler de eveniment la nivel de aplicație
1. in solution explorer, click dreapta pe App.xaml si se apelează view code
2. se crează o metodă pentru a gestiona evenimentul
void App_Startup(object sender, StartupEventArgs e)
{
// Handle the event here
}

3. In XAML, se adaugă handlerul de eveniment la declararea tagului Application


<Application x:Class="Application"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="Window1.xaml" Startup="App_Startup">
Comenzi WPF
Comenzi
• Taskuri de nivel inalt care sunt executate in aplicație
• Exemplu de comandă: Paste: copierea unui obiect din clipboard container
• Un eveniment este specific unei clase de baza si poate fi utilizat doar
pentru clase care exrtind aceasta clasa debaza – sunt cuplate cu clasele in
care sunt definite
• Comenzile WPF sunt asemenatoare evenimentelor dar sunt identpende de
un control specifi si pot fi applicate mai mutor tipuri de controale
• Se pot asocia orice număr de obiecte UI sau inputuri cu o comandă astfel
incat să se lege comanda de un handler care este executat atunci cand sunt
activate controalele
• Comanda poate fi dezactivată, atunci elementul de interfată la care
comanda este asociat este si el dezactivat
Comenzi predefinite
• ApplicationCommands - Close, Copy, Cut, Delete, Find, Open, Paste, Save, SaveAs, Redo,
Undo

• ComponentCommands -MoveDown, MoveFocusBack, MoveLeft, MoveRight, ScrollToEnd,


ScrollToHome

• EditingCommands - AlignCenter, CorrectSpellingError, DecreaseFontSize, EnterLineBreak


• MediaCommands - FastForward, NextTrack, Play, Rewind
• NavigationCommands - BrowseBack, BrowseForward, Favorites, LastPage, NextPage, Zoom

• Fiecare din aceste clase expune o varietate de obiecte comanda statice pe care le
putem utiliza in aplicatii; trebuie sa cream binding-uri si handlere pentru aceste
comenzi pt a le putea utiliza in aplicatie
Comenzi - arhitectura
• Obiectul Command: obiectul care reprezinta taskul
• Sursa comenzii: este controlul care generează comanda
• Handlerul comenzii: este metoda care se executa la invocarea
comenzii
• CommandBinding: obiectul utilizat de .NET Framework pentru a tine
evidenta asocierilor dintre surse si handlere
Implementarea unei comenzi
1. se decide comanda care se doreste a se utiliza
2. se asociază comanda cu un control sau cu un input
3. se crează metoda care gestionează comanda
4. se crează controlul CommandBinding care leagă obiectul Command
la handlerul de comandă si optional, la o metodă care gestionează
Command.CanExecute
5. se adaugă CommandBinding la collectia Commands a controlului sau
la controlul Window
Invocarea comenzii
• Prin asocierea ei cu un control folosind un input sau invocare cu un input

Asocierea comenzii cu un control


• Majoritatea controalelor implementează interfata ICommandSource -> se permite ca acestea să fie asociate
cu o comandă care este apelată automat cand este invocat controlul
<Button Command="ApplicationCommands.Find" ...>Button</Button>

Invocarea comenzii cu un input


• Se pot inregistra evenimente de mouse sau tastatură cu obiecte de tip Command care invoca comanda cand
aceste evenimente apar
ApplicationCommands.Find.InputGestures.Add(new
MouseGesture(MouseAction.LeftClick, ModifierKeys.Control));
ApplicationCommands.Find.InputGestures.Add(new
KeyGesture(Key.Q, ModifierKeys.Control));
Handlere de comenzi
• Pentru executarea unui cod atunci cand se invoca o comandă trebuie creat un CommandBinding care leagă
comanda de un handler
• Handler corect al unei comenzi:
private void myCommandHandler(object sender, ExecutedRoutedEventArgs e)
{
// Handle the command here
}
• ExecutedRoutedEventArgs este derivata din RoutedEventsArgs si expune proprietatea Command care
returnează obiectul Command al comenzii

Crearea CommandBinding
-asociaza o comanda cu un command handler
CommandBinding abinding = new CommandBinding();
abinding.Command = ApplicationCommands.Find;
abinding.Executed += new ExecutedRoutedEventHandler(myCommandHandler);
this.CommandBindings.Add(abinding);
Comenzi Bubbling
• Comenzile se rostogolesc către containerele din varful ierarhiei in care
rezidă controlul unde se invoca comanda
• Fiecare control are propria colecție CommandBinding
• Se poate opri rostogolirea procesarea comenzii prin setarea
Handled=true
private void myCommandHandler(object sender,
ExecutedRoutedEventArgs e)
{
// Handle the command here
e.Handled = true;
}
Dezactivarea comenzilor
• Comenzile care nu sunt asociate in CommandBinding sunt automat dezactivate
• Fiecare control care are in proprietatea Command asignat o comandă disables devine la randul lui dezactivat
• Pentru a dezactiva comenzi care sunt assignate in Command si avem setat si CommandBinding se utilizează
Command.CanExecute
• Este un eveniment care determină dacă o comandă se poate executa

1. se crează o metodă să gestioneze evenimentul CanExecute


bool canExecute;
void abinding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = canExecute;
}
2. Se setează handlerul evenimentului CanExecute a obiectului CommandBinding către această metodă
abinding.CanExecute += new
CanExecuteRoutedEventHandler(abinding_CanExecute);
WPF Data-Binding
• Controalele sunt implicate deseori in operatiile de data-binding

• Data binding – conectarea proprietatilor controalelor cu date care se


modifica pe parcursul ciclului de viata al aplicatiei
• Bifarea unui CheckBox pe baza unei proprietati de tip Boolean a unui
anumit obiect
• Afisarea datelor din baza de date in obiecte de tip DataGrid
• Conecatare unui Label la un intreg care reprezinta numarul de fisiere
intr-un director that represents the number of files in a folder
Operatii data-binding
• Sursa – ex. Proprietatea de tip Boolean property sau o bd relationala

• Destinatie – proprietatea controlului UI care utilizeaza datele


(ex. Proprietatea unui CheckBox sau TextBox)
Tipuri de data-binding
• One-time : Bindingul se face de la sursa la desinatie si se
efectueaza o singura data cand se porneste aplicatia
• One-way : Bindingul se face de la sursa la desinatie. Este util
pentru datele read-only deoarece nu se pot modifica datele
din
• Two-way : Utilizatorul poate modifica datele prin interfata .
Bindingul se realizeaza in ambele directii
• One-way-to-source: daca se modifica destinatia, sursa se
modifica

S-ar putea să vă placă și