Sunteți pe pagina 1din 27

Curs 2

Manageri de continut
Delegates, Evenimente, Expresii Lambda
Lect. dr. Florina Covaci
Manageri de conținut
• Gestiunea poziției controalelor în fereastră
• Gestionează comportamentul controalelor când
utilizatorul redimensionează fereastra
• controlul își păstrează poziția în care a fost plasat la
design-time

• controlul se repoziționează orizontal/vertical

MEDII DE PROGRAMARE ȘI DEZVOLTARE


Manageri de conținut
• Implicit când se creează o fereastă WPF ->Grid
<!- Butonul se afla în centrul ferestrei->
<Window x:Class="MyWPFApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/pres
entation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Fun with Panels!" Height="285" Width="325">
<Button x:Name="btnOK" Height = "100" Width="80"
Content="OK"/>
</Window>
Elemente multiple în scopul unei ferestre – eroare la compilare

MEDII DE PROGRAMARE ȘI DEZVOLTARE


Canvas
• Poziționare absolută a controalelor; controalele raman acolo unde au fost plasate la
design time
• Redimensionare a feresterei (mai mica decat Canvas)- continutul nu va fi vizibil decat
dupa ce mărimea va fi >=Canvas
<Canvas Background="LightSteelBlue">
<Button x:Name="btnOK" Canvas.Left="212" Canvas.Top="203" Width="80"
Content="OK"/>
<Label x:Name="lblDetalii" Canvas.Left="17" Canvas.Top="14" Width="328"
Height="27" FontSize="15" Content="Detalii persoana"/>
<Label x:Name="lblNume" Canvas.Left="17" Canvas.Top="60" Content="Nume"/>
<TextBox x:Name="txtNume" Canvas.Left="94" Canvas.Top="60" Width="193"
Height="25"/>
<Label x:Name="lblPrenume" Canvas.Left="17" Canvas.Top="109" Content="Prenume"/>
<TextBox x:Name="txtPrenume" Canvas.Left="94" Canvas.Top="107" Width="193"
Height="25"/>
<Label x:Name="lblStudii" Canvas.Left="17" Canvas.Top="155" Content="Studii"/>
<TextBox x:Name="txtStudii" Canvas.Left="94" Canvas.Top="153" Width="193"
Height="25"/>
</Canvas>
MEDII DE PROGRAMARE ȘI DEZVOLTARE
WrapPanel
• Permite definirea de conținut care își va modifica poziția pe
măsură ce fereastra este redimensionată
<WrapPanel Background="LightSteelBlue“ >
<Label x:Name="lblInstructions" Width="328" Height="27“
FontSize="15" Content="Detalii persoana"/>
<Label x:Name="lblNume" Content="Nume"/>
<TextBox x:Name="txtNume" Width="193" Height="25"/>
<Label x:Name="lblPrenume" Content="Prenume"/>
<TextBox x:Name="txtPrenume" Width="193" Height="25"/>
<Label x:Name="lblStudii" Content="Studii"/>
<TextBox x:Name="txtStudii" Width="193" Height="25"/>
<Button x:Name="btnOK" Width="80" Content="OK"/>
</WrapPanel>

MEDII DE PROGRAMARE ȘI DEZVOLTARE


StackPanel
• Similar cu WrapPanel
• Wrap vs. Strech
<StackPanel Background="LightSteelBlue" Orientation="Horizontal">
<Label x:Name="lblInstructions" Width="328" Height="27“
FontSize="15" Content="Detalii persoana"/>
<Label x:Name="lblNume" Content="Nume"/>
<TextBox x:Name="txtNume" Width="193" Height="25"/>
<Label x:Name="lblPrenume" Content="Prenume"/>
<TextBox x:Name="txtPrenume" Width="193" Height="25"/>
<Label x:Name="lblStudii" Content="Studii"/>
<TextBox x:Name="txtStudii" Width="193" Height="25"/>
<Button x:Name="btnOK" Width="80" Content="OK"/>
</StackPanel>

MEDII DE PROGRAMARE ȘI DEZVOLTARE


Grid
• Definirea si configurarea fiecarei coloane.
• Definirea si configurarea fiecarui rând. <Label x:Name="lblInstruction" Grid.Column
• Atribuirea de conținut fiecarei celule folosind ="0" Grid.Row ="0" FontSize="15"
attached property Content="Detalii persoana"/>
<Button x:Name="btnOK" Height ="30"
Grid.Column ="0" Grid.Row ="0" Content="OK"/>
<Grid ShowGridLines ="True"
Background ="LightSteelBlue"> <Label x:Name="lblNum" Grid.Column ="1"
Grid.Row ="0" Content="Nume"/>
<!- Define the rows/columns ->
<TextBox x:Name="txtNum" Grid.Column
<Grid.ColumnDefinitions> ="1" Grid.Row ="0" Width="193" Height="25"/>
<ColumnDefinition/> <Label x:Name="lblPrenum" Grid.Column
<ColumnDefinition/> ="0" Grid.Row ="1" Content="Prenume"/>
</Grid.ColumnDefinitions> <TextBox x:Name="txtPrenume"
Width="193" Height="25" Grid.Column ="0"
<Grid.RowDefinitions> Grid.Row ="1" />
<RowDefinition/>
<RowDefinition/> <Rectangle Fill ="LightGreen" Grid.Column ="1"
Grid.Row ="1" />
</Grid.RowDefinitions>
Grid(II)
• Dimensionarea liniilor si coloanelor:
• Absoluta (ex. 100)
• Autodimensionare
• Relativa(ex. 3x)

• GridSplitter – permit utlilizatorilor sa redimensioneze liniile sau


coloanele
<GridSplitter Grid.Column ="0" Width ="5" Grid.RowSpan="2"/>

MEDII DE PROGRAMARE ȘI DEZVOLTARE


DockPanel
<DockPanel LastChildFill ="True" Background="AliceBlue">
<Label DockPanel.Dock ="Top" Name="lblInstruction" FontSize="15"
Content="Detalii persoana"/>
<Label DockPanel.Dock ="Left" Name="lblNu" Content="Nume"/>
<Label DockPanel.Dock ="Right" Name="lblPrenu"
Content="Prenume"/>
<Label DockPanel.Dock ="Bottom" Name="lblSt" Content="Studii"/>
<Button Name="btnOK" Content="OK"/>
</DockPanel>
• La redimensionarea ferestrei, fiecare element ramane pe partea specificata
a panelului

MEDII DE PROGRAMARE ȘI DEZVOLTARE


Scrolling
<ScrollViewer>
<StackPanel>
<Button Content ="First" Background = "Green" Height ="40"/>
<Button Content ="Second" Background = "Red" Height ="40"/>
<Button Content ="Third" Background = "Pink" Height ="40"/>
<Button Content ="Fourth" Background = "Yellow" Height
="40"/>
<Button Content ="Fifth" Background = "Blue" Height ="40"/>
</StackPanel>
</ScrollViewer>

MEDII DE PROGRAMARE ȘI DEZVOLTARE


Delegates
• Delegates
• conțin referinte la metode care au acelasi tip de return si acelasi tip de
parametrii ca si delegate-ul
• Evenimente
• cod care are nevoie sa fie informat cand apare un eveniment. Cel mai obisnuit
scenariu - GUI
• Când un apare un eveniment aplicatia trebuie sa stie ce metoda sa execute;
acest lucru se realizează prin transmiterea metodei care gestionează
evenimentul ca si parametru la un delegate.

MEDII DE PROGRAMARE ȘI DEZVOLTARE


Declararea Delegates
• Clasa – definire proprietăți și metode apoi instanțiere obiecte din clasa
respectivă
• Delegates – declarare – precizam compilatorului ce fel de metoda va
referentia acel delegate apoi cream instante din acel delegate (in spate
compilatorul creaza clasa care reprezinta delegate-ul)

delegate void IntMethodInvoker(int x);

• Definim detalii despre semnătura si tipul de return al metodei pe care o


referențiază

delegate double TwoLongsOp(long first, long second);


delegate string GetAString();

MEDII DE PROGRAMARE ȘI DEZVOLTARE


Utilizarea Delegates
private delegate string GetAString();
public static void Main()
{
int x = 40;
GetAString firstStringMethod = new GetAString(x.ToString);
// GetAString firstStringMethod = x.ToString;
Console.WriteLine($"String is {firstStringMethod()}");
// Console.WriteLine($"String is {x.ToString()}");
}
//firstStringMethod.Invoke();

MEDII DE PROGRAMARE ȘI DEZVOLTARE


Action<T> and Func<T> Delegates
• Delegate-ul generic Action<T> - referentiaza o metoda cu tip de
return void ;
Action, Action<in T>, Action <in T1, in T2>… 16 param
• Delegate-ul Func<T> - referentiaza o metoda care are tip de return ;
Funct<out Result>, Func<in T, out Result>…16 param

delegate double DoubleOp(double x);

Func<double, double>
MEDII DE PROGRAMARE ȘI DEZVOLTARE
Bubble Sorter Class
bool swapped = true;
do
{swapped = false;
for (int i = 0; i < sortArray.Length—1; i++)
{
if (sortArray[i] > sortArray[i+1])) // problem with this test
{
int temp = sortArray[i];
sortArray[i] = sortArray[i + 1];
sortArray[i + 1] = temp;
swapped = true;
} } } while (swapped);

MEDII DE PROGRAMARE ȘI DEZVOLTARE


class BubbleSorter
{ static public void Sort<T>(IList<T> sortArray, Func<T, T, bool>
comparison)
{ bool swapped = true;
do
{ swapped = false;
for (int i = 0; i < sortArray.Count—1; i++)
{ if (comparison(sortArray[i+1], sortArray[i]))
{ T temp = sortArray[i];
sortArray[i] = sortArray[i + 1];
sortArray[i + 1] = temp;
swapped = true;
} } } while (swapped);
} }

MEDII DE PROGRAMARE ȘI DEZVOLTARE


Multicast Delegate
• Un delegate poate sa referentieze mai multe metode
• Apeleaza succesiv fiecare metoda
• Return type void
Action<double> operations = MathOperations.MultiplyByTwo;
operations += MathOperations.Square;

MEDII DE PROGRAMARE ȘI DEZVOLTARE


Evenimente
• Bazate pe Delegates pentru a oferi un mechanism de subscriere la
delegates

• Ex. Button – evenimentul Click

• O metoda handler (handler de evenimente) trebuie definita - este


invocata cand apare evenimentul Click

MEDII DE PROGRAMARE ȘI DEZVOLTARE


• 1. declararea delegate-ului
public delegate void EventHandler(object sender, EventArgs e);
• 2. declararea evenimentului gestionat prin delegate
• 3. scrierea metodei care să răspundă la eveniment (in clasa controlului care răspunde la
eveniment)
• 4. legarea evenimentului de handlerul său

MEDII DE PROGRAMARE ȘI DEZVOLTARE 20


Arhitectura de gestiune a evenimentelor
• Fiecare eveniment are
• un obiect (control) trimitător care aruncă (lansează) evenimentul
• un obiect (control) receptor care are metoda handler a
evenimentului
• Delegate: un obiect intermediar intre trimițător și receptor
• Este necesar pt ca trimițătorul nu știe ce procedură va gestiona
evenimentul
• Un delegate memorează o referință către metoda care va gestiona
evenimentul
• Definește numele handlerului si tipul argumentelor
• Sunt multicast -> pot memora referinte către mai multe handlere
• Functionează ca si un dispecer intre clasa care aruncă evenimentul prin
gestionarea unei liste de handlere de evenimente
MEDII DE PROGRAMARE ȘI DEZVOLTARE 21
Handlere de evenimente
• Metode legate de evenimente
• La aparitia evenimentului, se execută codul din handler

• Argumentele handlerului
• Un obiect care a aruncat evenimentul (sender)
• Un obiect care contine informatie specifica evenimentului (de tip
EventArgs)

MEDII DE PROGRAMARE ȘI DEZVOLTARE 22


Adaugarea / stergerea de handlere
• In designer:
• se selecteaza controlul dorit
• In fereastra de events, se selecteaza evenimentul care se doreste a fi prins

MEDII DE PROGRAMARE ȘI DEZVOLTARE 23


Expresii Lamdba

MEDII DE PROGRAMARE ȘI DEZVOLTARE


Expresii Lambda
class Program
{static void Main()
{string mid = ", middle part,";
Func<string, string> lambda = param =>
{
param += mid;
param += " and this was added to the string.";
return param;
};
Console.WriteLine(lambda("Start of string"));
}}

MEDII DE PROGRAMARE ȘI DEZVOLTARE


Expresii Lambda - Parametrii
Func<string, string> oneParam = s => $"change
uppercase {s.ToUpper()}";
Console.WriteLine(oneParam("test"));

Func<double, double, double> twoParams = (x, y)


=> x * y;
Console.WriteLine(twoParams(3, 2));

MEDII DE PROGRAMARE ȘI DEZVOLTARE


Linii multiple de cod
Func<double, double> square = x => x * x;
Func<double, double> square = x =>
{
return x * x;
}
• Func<string, string> lambda = param =>
•{
• param += mid;
• param += " and this was added to the string.";
• return param;
• };

MEDII DE PROGRAMARE ȘI DEZVOLTARE

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