Explication ligne par ligne - [Link].
cs et
[Link]
📄 [Link]
using [Link]; // Importe l'espace de noms [Link]
(contient Window, MessageBox, etc.)
using [Link]; // Importe l'espace de noms
[Link] (contient MouseButtonEventArgs, MouseButton, etc.)
namespace WpfApp1 // Déclare l'espace de noms WpfApp1 qui
regroupe toutes les classes du projet
{
public partial class Window1 : Window // Déclare la classe Window1 :
publique, partielle (définie dans XAML + CS), hérite de Window
{
public Window1() // Constructeur de Window1 : s'exécute
automatiquement quand on crée une instance de Window1
{
InitializeComponent(); // Méthode générée automatiquement : charge
le XAML, crée les contrôles en mémoire et les relie au code C#
[Link] += Window_MouseDown; // Abonne la méthode
Window_MouseDown à l'événement MouseDown de la fenêtre (clic souris)
}
private void Window_MouseDown(object sender, MouseButtonEventArgs e) //
Gestionnaire d'événement : exécuté quand on clique sur la fenêtre
{
if ([Link] == [Link]) // Vérifie si le bouton de
souris pressé est le bouton GAUCHE
[Link](); // Permet de déplacer la fenêtre en la faisant
glisser (car WindowStyle="None", pas de barre de titre)
}
private void AddButton_Click(object sender, RoutedEventArgs e) //
Gestionnaire du clic sur le bouton "Ajouter"
{
string city = [Link](); // Récupère le texte de la
TextBox et supprime les espaces avant/après
if () // Vérifie que la chaîne n'est ni
null ni vide (donc qu'il y a du texte)
{
[Link](city); // Ajoute la ville à la ListBox
(collection Items)
[Link](); // Vide la TextBox après l'ajout pour
permettre une nouvelle saisie
[Link](); // Remet le focus (curseur) dans la
TextBox pour que l'utilisateur puisse taper directement
}
}
private void DeleteButton_Click(object sender, RoutedEventArgs e) //
Gestionnaire du clic sur le bouton "Supprimer"
{
if ([Link] != null) // Vérifie si un élément est
sélectionné dans la ListBox (pas null = sélectionné)
{
[Link]([Link]); // Supprime
l'élément sélectionné de la ListBox
}
}
private void ClearButton_Click(object sender, RoutedEventArgs e) //
Gestionnaire du clic sur le bouton "Tout Supprimer"
{
[Link](); // Supprime TOUS les éléments de la
ListBox (vide la liste complètement)
}
private void QuitButton_Click(object sender, RoutedEventArgs e) //
Gestionnaire du clic sur le bouton "Quitter"
{
[Link](); // Ferme la fenêtre Window1 (méthode héritée de la
classe Window)
}
}
}
📄 [Link]
using [Link]; // Importe l'espace de noms [Link]
(contient Window, MessageBox, etc.)
using [Link]; // Importe l'espace de noms
[Link] (contient MouseButtonEventArgs, MouseButton, etc.)
namespace WpfApp1 // Déclare l'espace de noms WpfApp1 qui
regroupe toutes les classes du projet
{
public partial class Window2 : Window // Déclare la classe Window2 :
publique, partielle (définie dans XAML + CS), hérite de Window
{
public Window2() // Constructeur de Window2 : s'exécute
automatiquement quand on crée une instance de Window2
{
InitializeComponent(); // Méthode générée automatiquement : charge
le XAML, crée les contrôles en mémoire et les relie au code C#
[Link] += Window_MouseDown; // Abonne la méthode
Window_MouseDown à l'événement MouseDown de la fenêtre (clic souris)
}
private void Window_MouseDown(object sender, MouseButtonEventArgs e) //
Gestionnaire d'événement : exécuté quand on clique sur la fenêtre
{
if ([Link] == [Link]) // Vérifie si le bouton de
souris pressé est le bouton GAUCHE
[Link](); // Permet de déplacer la fenêtre en la faisant
glisser (car WindowStyle="None", pas de barre de titre)
}
private void AddButton_Click(object sender, RoutedEventArgs e) //
Gestionnaire du clic sur le bouton "Ajouter"
{
// Récupère le texte actuellement saisi dans la partie éditable de
la ComboBox
string city = [Link](); // Récupère le texte de la
ComboBox et supprime les espaces avant/après
if () // Vérifie que la chaîne n'est ni
null ni vide (donc qu'il y a du texte)
{
// Ajoute le texte à la liste si il n'y est pas déjà (optionnel
mais recommandé pour éviter les doublons)
if () // Vérifie si la ville
n'est PAS déjà présente dans la ComboBox
{
[Link](city); // Ajoute la ville à la
ComboBox (collection Items)
}
// On vide le texte saisi après l'ajout
[Link] = [Link]; // Vide le texte de la
ComboBox ([Link] = chaîne vide "")
[Link] = -1; // Désélectionne tout élément
(-1 = aucun élément sélectionné, retour au mode texte libre)
}
}
private void DeleteButton_Click(object sender, RoutedEventArgs e) //
Gestionnaire du clic sur le bouton "Supprimer"
{
if ([Link] != null) // Vérifie si un élément de
la liste déroulante est sélectionné
{
[Link]([Link]); //
Supprime l'élément sélectionné de la ComboBox
}
else if () // Sinon,
vérifie si du texte est tapé dans la ComboBox
{
// Si rien n'est sélectionné mais qu'un texte est tapé, on
essaie de le supprimer
[Link]([Link]); // Supprime
l'élément correspondant au texte tapé
[Link] = [Link]; // Vide le texte de la
ComboBox après suppression
}
}
private void ClearButton_Click(object sender, RoutedEventArgs e) //
Gestionnaire du clic sur le bouton "Tout Supprimer"
{
[Link](); // Supprime TOUS les éléments de la
ComboBox (vide la liste complètement)
[Link] = [Link]; // Vide également le texte de la
ComboBox
}
private void QuitButton_Click(object sender, RoutedEventArgs e) //
Gestionnaire du clic sur le bouton "Quitter"
{
[Link](); // Ferme la fenêtre Window2 (méthode héritée de la
classe Window)
}
}
}
📄 [Link]
<Window x:Class="WpfApp1.Window1" <!-- Déclare la fenêtre WPF associée à la
classe C# Window1 du namespace WpfApp1 -->
xmlns="[Link] <!--
Espace de noms par défaut pour les contrôles WPF (Window, Button, ListBox, etc.)
-->
xmlns:x="[Link] <!-- Espace de
noms XAML avec préfixe 'x' pour les directives (x:Class, x:Name, etc.) -->
Title="Win1 : ListBox" Height="350" Width="500" <!-- Titre de la
fenêtre, hauteur 350px, largeur 500px -->
ResizeMode="NoResize" WindowStyle="None"> <!-- Fenêtre non
redimensionnable, sans barre de titre (style personnalisé) -->
<Grid Margin="15"> <!-- Conteneur Grid (grille) avec une marge de 15px
autour -->
<[Link]> <!-- Définition des colonnes de la grille -->
<ColumnDefinition Width="*" /> <!-- Colonne 0 : largeur
proportionnelle (* = prend tout l'espace disponible) -->
<ColumnDefinition Width="200" /> <!-- Colonne 1 : largeur fixe de
200 pixels -->
</[Link]>
<ListBox x:Name="CityListBox" [Link]="0" Margin="0,0,15,0" /> <!--
ListBox dans colonne 0, marge droite 15px, nommée CityListBox pour accès C# -->
<StackPanel [Link]="1"> <!-- StackPanel (empilement vertical) dans
colonne 1, contient les boutons -->
<Label Content="Entrer une Ville" Margin="0,0,0,2" /> <!-- Label
(étiquette) avec texte "Entrer une Ville", marge basse 2px -->
<TextBox x:Name="CityTextBox" Margin="0,0,0,15" Padding="3" /> <!--
TextBox (zone de texte) nommée CityTextBox, marge basse 15px, padding interne
3px -->
<Button Content="Ajouter" x:Name="AddButton" Click="AddButton_Click"
<!-- Bouton "Ajouter", nommé AddButton, clic → méthode AddButton_Click -->
Background="DeepPink" Foreground="White" Margin="0,0,0,8"
Padding="5" /> <!-- Fond rose vif, texte blanc, marge basse 8px, padding 5px --
>
<Button Content="Supprimer" x:Name="DeleteButton"
Click="DeleteButton_Click" <!-- Bouton "Supprimer", nommé DeleteButton, clic →
méthode DeleteButton_Click -->
Background="HotPink" Foreground="White" Margin="0,0,0,8"
Padding="5" /> <!-- Fond rose, texte blanc, marge basse 8px, padding 5px -->
<Button Content="Tout Supprimer" x:Name="ClearButton"
Click="ClearButton_Click" <!-- Bouton "Tout Supprimer", nommé ClearButton, clic
→ méthode ClearButton_Click -->
Background="HotPink" Foreground="White" Margin="0,0,0,8"
Padding="5" /> <!-- Fond rose, texte blanc, marge basse 8px, padding 5px -->
<Button Content="Quitter" x:Name="QuitButton"
Click="QuitButton_Click" <!-- Bouton "Quitter", nommé QuitButton, clic →
méthode QuitButton_Click -->
Background="HotPink" Foreground="White" Margin="0,0,0,20"
Padding="5" /> <!-- Fond rose, texte blanc, marge basse 20px, padding 5px -->
</StackPanel>
</Grid>
</Window> <!-- Fin de la fenêtre Window1 -->
📄 [Link]
<Window x:Class="WpfApp1.Window2" <!-- Déclare la fenêtre WPF associée à la
classe C# Window2 du namespace WpfApp1 -->
xmlns="[Link] <!--
Espace de noms par défaut pour les contrôles WPF -->
xmlns:x="[Link] <!-- Espace de
noms XAML avec préfixe 'x' pour les directives -->
Title="Win2 : ComboBox" Height="300" Width="300" <!-- Titre "Win2 :
ComboBox", hauteur 300px, largeur 300px -->
ResizeMode="NoResize" WindowStyle="None"> <!-- Fenêtre non
redimensionnable, sans barre de titre -->
<StackPanel Margin="20"> <!-- StackPanel (empilement vertical) avec marge
de 20px autour -->
<Label Content="Gérer les Villes" /> <!-- Label avec texte "Gérer les
Villes" -->
<ComboBox x:Name="CityComboBox" Margin="0,0,0,20" Padding="5"
IsEditable="True" /> <!-- ComboBox nommée CityComboBox, éditable
(IsEditable=True), marge basse 20px -->
<Button Content="Ajouter" Click="AddButton_Click" <!-- Bouton
"Ajouter", clic → méthode AddButton_Click -->
Background="DeepPink" Foreground="White" Margin="0,0,0,8"
Padding="8" /> <!-- Fond rose vif, texte blanc, marge basse 8px, padding 8px --
>
<Button Content="Supprimer" Click="DeleteButton_Click" <!-- Bouton
"Supprimer", clic → méthode DeleteButton_Click -->
Background="HotPink" Foreground="White" Margin="0,0,0,8"
Padding="8" /> <!-- Fond rose, texte blanc, marge basse 8px, padding 8px -->
<Button Content="Tout Supprimer" Click="ClearButton_Click" <!-- Bouton
"Tout Supprimer", clic → méthode ClearButton_Click -->
Background="HotPink" Foreground="White" Margin="0,0,0,8"
Padding="8" /> <!-- Fond rose, texte blanc, marge basse 8px, padding 8px -->
<Button Content="Quitter" Click="QuitButton_Click" <!-- Bouton
"Quitter", clic → méthode QuitButton_Click -->
Background="HotPink" Foreground="White" Margin="0,0,0,8"
Padding="8" /> <!-- Fond rose, texte blanc, marge basse 8px, padding 8px -->
</StackPanel>
</Window> <!-- Fin de la fenêtre Window2 -->
🎯 Différences principales entre Window1 et Window2
Élément Window1 Window2
Contrôle principal ListBox ComboBox
Saisie de ville TextBox séparée ComboBox éditable
(IsEditable="True")
Ajout Ajoute toujours (peut créer des Vérifie les doublons avec
doublons) Contains() avant d'ajouter
Suppression Supprime seulement l'élément Supprime l'élément sélectionné
sélectionné OU le texte tapé manuellement
Clear Vide seulement la liste Vide la liste ET le texte de la
ComboBox
Layout Grid à 2 colonnes (ListBox à StackPanel vertical (tout
gauche, boutons à droite) empilé)
🔑 Concepts clés à retenir pour l'examen
1. Événements (Events) : En C#/.NET, les événements permettent à un objet de notifier
d'autres objets qu'un événement s'est produit (clic, souris, clavier). On s'abonne avec +=.
2. WPF (Windows Presentation Foundation) : Framework Microsoft pour créer des
applications Windows avec interface graphique. Séparation entre XAML (interface) et C#
(logique).
3. XAML : Langage de balisage pour décrire l'interface utilisateur. Chaque balise correspond à
un contrôle visuel.
4. Code-behind : Fichier .[Link] qui contient la logique C# associée au fichier XAML.
5. partial class : Une classe déclarée dans plusieurs fichiers. Le compilateur les fusionne en
une seule classe complète.
6. Routed Events : En WPF, les événements peuvent "remonter" dans l'arbre visuel
(tunneling/bubbling), permettant de gérer un événement à différents niveaux.
7. Contrôles WPF utilisés :
• Window : Fenêtre de l'application.
• ListBox : Liste d'éléments sélectionnables (Window1).
• ComboBox : Liste déroulante + zone de texte éditable (Window2).
• TextBox : Zone de texte simple (Window1).
• Button : Bouton cliquable.
• Label : Texte non éditable (étiquette).
• StackPanel : Panneau qui empile les contrôles verticalement.
• Grid : Grille avec lignes et colonnes pour un layout plus précis.