Visual Studio
Il setup per Visual Studio comprende:
- Toolbox: elenco dei componenti (
Control
)che posso usare allβinterno della finestra di lavoro (ListView
,Combobox
β¦) e posso mostrarla tramiteView -> Toolbox
Nomi
Ogni elemento in XAML puΓ² avere un nome in modo che possa essere riferito code-behind. La sintassi Γ¨:x_Name="xxxx"
.
Una convenzione carina per il nome da dare Γ¨: significatoSemanticoNomeControl
.
Per esempio se Γ¨ un bottone che rappresenta una percentuale il suo nome sarΓ percentageButton
.
Grid
Questa Γ¨ la struttura fondamentale di XAML, Γ¨ formata da righe e colonne, ognuna della loro dimensione, con degli elementi che appartengono ad ogni cella. Property comode:
Grid.Row|Column
: a che riga/colonna appartiene lβelementoGrid.Column|Row Span
: quante righe/colonne occupa lβelemento
Dimensioni
Auto
: la larghezza della colonna dipende dal contenuto ed Γ¨ esattamente il minimo per contenere gli oggetti contenuti. Per esempio se nella colonna ho un Button largo 100 la colonna sarΓ larga 100. Se non ho nulla sarΓ larga 0*
: la dimensione Γ¨ proporzionale al numero di elementi*
. Per esempio con un solo elemento*
sarà 100%, con due elementi ognuno sarà 50% e così via.xxx px
: la dimensione Γ¨ fissa a tali px.
Stili
Gli stili di una applicazione possono essere definiti con vari scope e essere espliciti o impliciti.
Gli stili espliciti sono degli stili che devono essere poi referenziati dal Control che li vuole utilizzare mediante il comando StaticResource
o DynamicResource
.
Gli stili impliciti invece si associano implicitamente ad un tipo di oggetto, per esempio lo stile di tutti i Button dellβapplicazione, lo stile di tutte le label e cosΓ¬ via.
Stili Impliciti
Per stilare tutti gli elementi di un determinato tipo devo definire un tag Style
a livello di Window
o di Application
con un attributo TargetType
che identifica a che Control
associargli.
In questo esempio associo un determinato stile a tutti i Button e la Label dellβapplicazione
<Style TargetType="Button">
<Setter Property="Foreground" Value="White"/>
<Setter Property="FontSize" Value="25"/>
</Style>
<Style TargetType="Label">
<Setter Property="FontSize" Value="70"/>
</Style>
Stili espliciti
Posso anche definire degli stili che devono essere esplicitamente referenziati tramite lβattributo x:Key
e lo {StaticResource}
.
Questi stili possono anche ereditare da un altr
o stile grazie al tag BasedOn
.
<Style TargetType="Button" x:Key="operatorButtonsStyle" BasedOn="{StaticResource numberButtonsStyle}">
<Setter Property="Background" Value="{StaticResource operatorsColor}"/>
</Style>
<Style TargetType="Button" x:Key="additionalButtonsStyle" BasedOn="{StaticResource numberButtonsStyle}">
<Setter Property="Background" Value="LightGray"/>
<Setter Property="Foreground" Value="Black"/>
</Style>
Scope
Singolo tag
Ogni tag puΓ² avere il suo stile esplicitato. PuΓ² andare bene solo se quello stile lo ha solo quello specifico elemento
<Button x:Name="divisionButton" Background="Orange" Foreground="White"/>
Window
Ogni Window
puΓ² avere degli stili definiti come Resources
privati. In questo modo evito di copincollare gli stili per tutta la finestra ma non espongo questi stili al mondo esterno.
Per esempio in questo caso definisco due colori
<Window.Resources>
<SolidColorBrush x:Key="numbersColor" Color="#666666"/>
<SolidColorBrush x:Key="operatorsColor" Color="Green"/>
</Window.Resources>
e li referenzio in questo modo:
<Button Background="{StaticResource operatorsColor}"/>
Application
Eβ possibile definire degli stili che siano validi per tutta lβapplicazione. Questi vengono definiti nel file App.xaml
<Application.Resources>
<SolidColorBrush x:Key="numbersColor" Color="#333333"/>
<SolidColorBrush x:Key="operatorsColor" Color="Green"/>
<SolidColorBrush x:Key="foregroundColor" Color="White"/>
</Application.Resources>
Binding
Il binding Γ¨ il link tra lβObject
code behind e il Control UI
.
Il Data Binding
Γ¨ la mappatura tra il nome della property dellβoggetto del model e lβattributo del Control.
Ogni Binding ha le seguenti property:
Path
: oggetto a cui voglio puntare- Mode
OneWay
(default): lβUI si popola in base al model ma non il contrario. (es.Label
)TwoWay
: lβUI dipendere dal model ma anche il model viene modificato se cambia lβUI (es. unaTextBox
)TwoWay
eUpdateSourceTrigger=PropertyChanged
: Come sopra con lβaggiunta che il model viene cambiato ad ogni cambio della property in modo immediato e non quando lβoggetto perde il focus (che Γ¨ il comportamento di default)OneWayToSource
: il contrario diOneWay
, quindi prende il valore dello XAML e lo imposta in C# ma non viceversa.OneTime
: comeOneWay
ma che avviene solo una volta quando viene settato ilDataContext
.
Context
Il Context
Γ¨ il luogo dove andare a prendere lβoggetto del model. Posso avere context per lβintera finestra e poi overridare questo context nella Grid
e in ogni eventuale figlio.
ListView
Questo Control
Γ¨ fondamentale per rappresentare un insieme di elementi.
In particolare tramite la sua property ItemsSource
posso definire la collection (IEnumerable
) di cui fare il foreach e tramite la sua property ItemTemplate posso definire come il singolo oggetto viene rappresentato.
<ListView ItemsSource="{Binding Contacts}">
<!-- ItemTemplate permette di definire come viene visualizzato ogni elemento della mia ListView-->
<ListView.ItemTemplate>
<!-- DataTemplate indica un template che dipende dal binding. PuΓ² contenere sia oggetti normali che UserControl custom-->
<DataTemplate>
<!-- Qui ho come DataContext il singolo elemento di ItemsSource della ListView-->
<uc:ContactControl Contact="{Binding}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>