Documente Academic
Documente Profesional
Documente Cultură
Laborator 2
Laborator 2
1. XAML Introduction
XAML este un limbaj declarativ de markup. Așa cum este aplicat modelului de programare
.NET Framework, XAML simplifică crearea unui UI pentru o aplicație .NET Framework. Puteți
crea elemente de interfață UI vizibile în limbajul declarativ XAML și apoi sa separați definiția
UI de logica programului din fisierele ce contin codul sursa.
Prima aplicatie WPF
Din meniul File -> New -> Project selectati WPF App (.NET Framework).
Fiecare obiect RowDefinition poate definit inaltimea unui rand prin mai multe moduri. Una din
modalitati este proportionala, sau star-sizing. Valoarea implicita a inaltimii unui rand, este de o
*. Practic, inaltimea Grid-ului se va imparti la numarul de stelute, iar inaltimea fiecarui rand va
depinde de numarul de stelute definit.
<Rectangle Fill="Red" Grid.Row="0" />
<Rectangle Fill="Orange" Grid.Row="1"/>
<Rectangle Fill="Yellow" Grid.Row="2" />
<Rectangle Fill="Green" Grid.Row="3"/>
<Rectangle Fill="Blue" Grid.Row="4" />
<Rectangle Fill="Indigo" Grid.Row="5"/>
Alte modalitati de a seta inaltimea unui rand sunt prin a specifica explicit valoarea acesteia in
device independent pixels, sau prin setarea valorii Auto, care calculeaza inaltimea in functie de
celelalte elemente din Grid.
Pentru adaugarea coloanelor, vom crea ColumnDefinitions.
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="2*" />
</Grid.ColumnDefinitions>
Vom rearanja dispunerea dreptunghiurilor.
Adaugati un label:
<Label Content="Rectangles showing column width"
FontSize="24"
Grid.Row="4" />
Se observa ca textul este limitat doar la nivelul primei celule din rand.
<Label Content="Rectangles showing column width"
FontSize="24"
Grid.Row="4"
Grid.ColumnSpan="2"/>
<Rectangle Fill="Wheat"
Grid.Row="5" />
<Rectangle Fill="Purple"
Grid.Row="5"
Grid.Column="1" />
StackPanel
Creati o noua aplicatie WPF: LayoutWithStackPanel. Un StackPanel permite aranjarea
obiectelor sub forma unei stive.
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
<RowDefinition />
<RowDefinition />
<RowDefinition />
<RowDefinition />
<RowDefinition />
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<StackPanel Orientation="Horizontal" >
<TextBlock Text="Your Name" Margin="5"/>
<TextBox Width="80" Height="Auto" Margin="5"/>
</StackPanel>
</Grid>
WrapPanel
Un WrapPanel plaseaza obiectele unl langa celalalt pana cand nu mai incap in panou, apoi
creeaza un al doilea rand de obiecte continuand dupa aceeasi structura.
<WrapPanel>
<Rectangle Fill="Red" Width="50" Height="50" />
<Rectangle Fill="Orange" Width="50" Height="50" />
<Rectangle Fill="Yellow" Width="50" Height="50" />
<Rectangle Fill="Green" Width="50" Height="50" />
<Rectangle Fill="Blue" Width="50" Height="50" />
<Rectangle Fill="Indigo" Width="50" Height="50" />
<Rectangle Fill="Violet" Width="50" Height="50" />
<Rectangle Fill="Red" Width="50" Height="50" />
<Rectangle Fill="Orange" Width="50" Height="50" />
<Rectangle Fill="Yellow" Width="50" Height="50" />
<Rectangle Fill="Green" Width="50" Height="50" />
<Rectangle Fill="Blue" Width="50" Height="50" />
<Rectangle Fill="Indigo" Width="50" Height="50" />
<Rectangle Fill="Violet" Width="50" Height="50" />
</WrapPanel>
Orientarea implicita a unui WrapPanel este orizontala. Schimati orientarea panoului curent pe
verticala: Orientation="Vertical".
DockPanel
Obiectele dintr-un DockPanel se aliniaza dupa o anumita orientare.
<DockPanel>
<Button Height="25"
Background="Red"
DockPanel.Dock="Top" />
<Button Width="25"
Background="Orange"
DockPanel.Dock="Left" />
<Button Width="25"
Background="Yellow"
DockPanel.Dock="Right" />
<Button Height="25"
Background="Green"
DockPanel.Dock="Bottom" />
<Button Background="Purple" />
</DockPanel>
Canvas
Obiectele dintr-un Canvas se aliniaza dupa o pozitie absoluta.
<Canvas>
<Rectangle Canvas.Left="25"
Canvas.Top="25"
Width="50"
Height="40"
Fill="Red" />
<Rectangle Canvas.Left="100"
Canvas.Top="25"
Width="50"
Height="40"
Fill="Orange" />
<Rectangle Canvas.Left="125"
Canvas.Top="40"
Width="50"
Height="40"
Fill="Blue" />
<Ellipse Canvas.Left="25"
Canvas.Top="200"
Width="40"
Height="40"
Fill="Green" />
</Canvas>
Controls
Controalele sunt mercanisme on-screen care afiseaza si colecteaza informatia de la utilizator.
In mare acestea se clasifica in:
Text Controls
Selection Controls
List Controls
Other Controls
Pentru trecerea in revista a controalelor, vom crea un formular simplu. Creati o noua aplicatie
WPF: SimpleFormApp.
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="2*" />
</Grid.ColumnDefinitions>
<TextBlock Text="Full Name"
HorizontalAlignment="Right"
VerticalAlignment="Bottom"
Margin="5" />
<TextBox Grid.Column="1"
Name="FullName"
Width="250"
Height="20"
HorizontalAlignment="Left"
VerticalAlignment="Bottom"
Margin="5" />
<TextBlock HorizontalAlignment="Right"
VerticalAlignment="Bottom"
Margin="5"
Grid.Row="1"
TextWrapping="Wrap"
Text="Sex" />
<StackPanel Orientation="Horizontal"
Grid.Row="1"
Grid.Column="1"
VerticalAlignment="Stretch"
HorizontalAlignment="Stretch">
<RadioButton GroupName="Sex" Name="Male" Content="Male" IsChecked="True"
Margin="5" />
<RadioButton GroupName="Sex" Name="Female" Content="Female" IsChecked="False"
Margin="5" />
</StackPanel>
<TextBlock Text="Do you own"
Grid.Row="2"
HorizontalAlignment="Right"
VerticalAlignment="Bottom"
Margin="5" />
<StackPanel Orientation="Horizontal"
Grid.Row="2"
Grid.Column="2"
VerticalAlignment="Bottom"
HorizontalAlignment="Left">
<CheckBox Name="Desktop" Content="Desktop" Margin="5" />
<CheckBox Name="Laptop" Content="Laptop" Margin="5" />
<CheckBox Name="Tablet" Content="Tablet" Margin="5" />
</StackPanel>
<TextBlock Text="Your job"
Grid.Row="3"
HorizontalAlignment="Right"
VerticalAlignment="Bottom"
Margin="5" />
<ComboBox Grid.Row="3"
Name="Job"
Grid.Column="1"
HorizontalAlignment="Left"
VerticalAlignment="Bottom"
Margin="5">
<ComboBoxItem Content="Programmer" />
<ComboBoxItem Content="Designer" />
<ComboBoxItem Content="Architect" />
<ComboBoxItem Content="Manager" />
<ComboBoxItem Content="Seller" />
</ComboBox>
<TextBlock Text="Promissed delivery date"
Grid.Row="4"
HorizontalAlignment="Right"
VerticalAlignment="Bottom"
Margin="5" />
<Calendar Grid.Row="4"
Name="DeliveryDate"
Grid.Column="1"
Margin="5"
HorizontalAlignment="Left" />
</Grid>
In momentul de fata, aplicatia afiseaza un formular static. In continuare vom dezvolta logica
aplicatiei, pentru colectarea datelor de la utilizator si afisarea lor intr-un MessageBox.
Events
Vom adauga un buton imediat dupa obiectul Calendar din Grid.
<Button Content="Save"
Name="SaveButton"
Grid.Row="5"
Margin="5"
HorizontalAlignment="Right"
Click="SaveButton_Click" />
Putem defini un eveniment prin fereastra de proprietati ale butonului, sau scriindu-l direct in
codul XAML. In clasa MainWindow s-a creat automat evenimentul:
private void SaveButton_Click(object sender, RoutedEventArgs e)
Pentru afisarea informatiilor, vom crea un obiect StringBuilder si vom adauga datele introduce
de utilizator.
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append("Full Name: ");
stringBuilder.Append(FullName.Text);
stringBuilder.Append(" Sex: ");
stringBuilder.Append( (bool) Male.IsChecked ? "Male" : "Female");
stringBuilder.Append( " Computer: ");
stringBuilder.Append((bool)Desktop.IsChecked ? "Desktop" : "");
stringBuilder.Append((bool)Laptop.IsChecked ? "Laptop" : "");
stringBuilder.Append((bool)Tablet.IsChecked ? "Tablet" : "");
stringBuilder.Append(" Your job: ");
stringBuilder.Append(Job.SelectedItem.ToString());
stringBuilder.Append(" Delivery date: ");
stringBuilder.Append(DeliveryDate.SelectedDate.ToString());
MessageBox.Show(stringBuilder.ToString());
In MainWindow.xaml:
<Grid>
<StackPanel Name="Display">
<StackPanel Orientation="Horizontal">
<TextBlock Text="Name: " />
<TextBlock Margin="5,0,0,0" Text="{Binding Name}" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Title: " />
<TextBlock Margin="5,0,0,0" Text="{Binding Title}" />
</StackPanel>
</Grid>
2.2 INPC
Este posibil ca mai mult de o persoana sa modifice datele. Clasa Employee trebuie sa
implementeze interfata INotifyPropertyChanged.
public class Employee : INotifyPropertyChanged
{
private string _name;
private string _title;
MainWindow.cs:
public partial class MainWindow : Window
{
private Employee _employee;
public MainWindow()
{
InitializeComponent();
_employee = new Employee()
{
Name = "John",
Title = "Developer"
};
DataContext = _employee;
}
return employees;
}
}
MainWindow.xaml:
<Grid>
<ComboBox Name="Presidents" ItemsSource="{Binding}" FontSize="30" Height="50"
Width="550">
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Margin="2">
<TextBlock Text="Name: "
Margin="2" />
<TextBlock Text="{Binding Name}"
Margin="2" />
<TextBlock Text="Title: "
Margin="10, 2, 0, 2" />
<TextBlock Text="{Binding Title}"
Margin="2" />
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</Grid>