Windows Presentation Foundation

Introduzione

Configurazione di Visual Studio
Per lo sviluppo di applicazioni per Windows, selezionare "Sviluppo per desktop .NET":

.NET 5 e 6: open source, cross-platform
.NET Framework 4: solo per Windows

Markup XAML per implementare l'aspetto di un'applicazione
Code-behind (dietro) per implementare il suo comportamento: funzionalità che rispondono alle interazioni dell'utente.

Element tree: gerarchia di elementi della UI annidati (XAML è basato su XML)

Prima applicazione WPF







Controlli comuni

StackPanel

StackPanel

Contenitore di una pila di altri controlli:


TextBlock e Label

TextBlock



Per paragrafi di testo. Interessanti le proprietà
  • Text: il testo
  • TextWrapping: testo a capo
  • TextTrimming: taglio di stringhe troppo lunghe
  • Foreground: colore del testo
  • Background: colore di sfondo
  • Margin
  • Padding
  • <LineBreak />
  • <Bold>
  • <Italic>
  • <Underline />
  • <Hyperlink />
  • <Span>: per applicare a un pezzo di testo stili specifici

Label

Una label può essere un semplice testo oppure contenere altri controlli:


Button e eventi




Per il content accetta un solo nodo, ma per metterne altri basta usare uno StackPanel:
<Button>
    <StackPanel Orientation="Horizontal">
    <TextBlock>Formatted </TextBlock>
    <TextBlock Foreground="Blue" FontWeight="Bold" Margin="2,0">Button</TextBlock>
    <TextBlock Foreground="Gray" FontStyle="Italic">[Various]</TextBlock>
    </StackPanel>
</Button>

TextBox



TextBox

Permette all'utente di inserire del testo.
  • AcceptsReturn
  • TextWrapping
  • IsReadOnly

Evento SelectionChanged:
private void TextBox_SelectionChanged(object sender, RoutedEventArgs e)
		{
			TextBox textBox = sender as TextBox;
			txtStatus.Text = "Selection starts at character #" + textBox.SelectionStart + Environment.NewLine;
			txtStatus.Text += "Selection is " + textBox.SelectionLength + " character(s) long" + Environment.NewLine;
			txtStatus.Text += "Selected text: '" + textBox.SelectedText + "'";
		}

Le proprietà sono anche scrivibili: è possibile usarle per cambiare la selezione.


Fare calcoli e gestire le eccezioni
Definiamo textA, textB, buttonSomma e labelRisultato:

Possiamo analizzare il testo inserito dall'utente ed estrarre i numeri A e B per poi sommarli in questo modo:


Gestire le eccezioni


Se l'utente inserisce dei valori non validi, questo dà origine a un'eccezione.

Se lasciate a sè stesse le eccezioni interrompono completamente l'esecuzione del programma, perché il computer non sa più come procedere.

Esse devono quindi essere gestite:


In questo frammento proviamo (try) a convertire il contenuto di textA e textB: se questa operazione dà luogo a un'eccezione, questa viene catturata (catch) e nella label viene mostrato un testo che spiega all'utente il problema.



Convertire numeri in stringhe


Formattare i numeri con la virgola

Lavorando con i numeri razionali (con virgola), ad esempio i double, dobbiamo prima convertire il testo inserito dall'utente in double:


dopodiché formattare il risultato:


Quando si crea una stringa con un certo formato usando String.Format(), bisogna specificare il formato, nell'esempio {0:N2}:

  • 0: indica che deve essere preso il parametro di indice 0, in questo caso quoziente
  • N: indica che il parametro dev'essere convertito in un numero
  • 2: indica che vogliamo approssimare il risultato a 2 cifre decimali




RadioButton



CheckBox
Dati i controlli textNome, checkFormale, buttonSaluta, labelSaluto:

il codice seguente verifica se la checkBox è contrassegnata, e compone di conseguenza il messaggio di saluto:


CheckBox

<CheckBox IsChecked="True">Enable feature XYZ</CheckBox>

  • isThreeState: aggiunge uno stato indeterminato (true, false e null)

PasswordBox

Image

Image

<Image Width="100" Source="/Images/google.png" />



Sliders

Calendar e DatePicker

DatePicker


Expander


Style

Style

Per applicare un padding a tutti i pulsanti:
<Window.Resources>
    <Style TargetType="{x:Type Button}">
      <Setter Property="Padding" Value="20"/>
    </Style>
</Window.Resources>



ListBox
Dati i controlli listNomi e labelSaluto:

Andiamo a inizializzare il contenuto della lista aggiungendo ai suoi elementi (Items) una serie di stringhe con il metodo .Add():


Facendo doppio click sulla listBox si apre il gestore dell'evento SelectionChanged, che viene richiamato ogni volta che l'utente clicca su uno degli elementi della lista:


Qui modifichiamo il contenuto di labelSaluto utilizzando il nome selezionato.


ComboBox


La ComboBox ha un funzionamento simile:


Essa combina una TextBox e una ListBox: è possibile quindi usarla come abbiamo visto sopra, ma anche andare a leggere il suo valore come in questo esempio:

Andando a flaggare la sua proprietà isEditable:

abbiamo la possibilità di scrivere del testo a piacere, in aggiunta alle possibilità presenti nella lista.

Aggiunta di controlli code behind

ComboBox

Pannelli

Grid
Possiamo definire la larghezza delle colonne della griglia:

Una delle opzioni è anche Auto: sarà il contenuto (in questo caso il bottone) a determinare la larghezza della colonna:

Definizione di righe:

Un oggetto può occupare più colonne:

o più righe:

StackPanel

Per impilare i controlli:

Variante orizzontale:

Nidificati:

Allineamento orizzontale:

Allineamento dei singoli elementi:

Allineamento verticale:

ScrollViewer


WrapPanel
Se serve gli elementi vanno a capo:

Verticale:


DockPanel

Per fare in modo che l'ultimo child non prenda tutto lo spazio rimanente:


Canvas

Menù

Menu

Icone:

Evento Click:


ToolBarTray

Bottone per cancellare il testo:

Cancellazione del testo:

Separator, label e combobox:

IsSelected:

Evento di cambio del valore nella ComboBox:

Aggiungiamo un nome alla ComboBox:

Cambio del font size:

Tooltip:

ContextMenu

Aggiunta di un menù contestuale al bottone:

Checked:

Icona nel menù:


StatusBar

ProgressBar:

Separator:

Dialogs

OpenFile
Preparativi:

Lettura di un file:

Cartella iniziale:

Filtri:


SaveFile

Databinding

Liste





Taste

Per far riconoscere gli enum nei file xaml:

Aggiunta della risorsa alla Window:

Collegamento ComboBox:



Cars
CarType:

Car:

Cars:

Risorse:

Grid:

Label e ListBox:

DataTemplate:

Navigation

Introduzione

Frame e pagine

Bottoni per la navigazione:

Dettagli del Frame:

Creazione di una Page:

Page1 e Page2:

Cliccando i bottoni si passa alla pagina corrispondente:

Avanti e indietro:

UserControl


Inserimento del controllo nelle pagine:

Delegate:

Invio dell'evento:

Consumazione dell'evento:

Navigazione con eventi:


Animations

Trasparenza

Evento mouseenter:

Animazione code behind:

Assegnazione di un comando al bottone:

Command binding:
Callback:

LINQ
Language Integrated Query:

Sintassi basata sui metodi:

Definizione di una lista:

Stringify:


Filtra i pari: