décembre
2008
Je tiens tout d’abord à remercier l’équipe de Developpez.com pour m’avoir permis de créer ce blog !
Passons maintenant aux astuces WPF qui porteront aujourd’hui sur deux sujets : l’héritage de la classe Window et des Storyboards en XAML.
Commençons donc avec l’héritage de la classe Window.
Imaginons que nous avons comme projet de faire une jolie application WPF, avec des fenêtres personnalisées. Problème : on supprime la barre de titre Windows, donc la possibilité de déplacer la fenêtre en la cliquant et la déplaçant. Il faut donc implémenter ce comportement à toutes nos fenêtres.
En windows form, on pouvait très facilement faire une fenêtre mère dont hériterait des fenêtres enfant afin d’avoir par exemple le même comportement.
Mais en WPF, on ne peut pas le faire aussi simplement.
En effet, si on fait hériter notre classe Window1 de notre fenêtre mère MotherWindow dans le fichier Window1.xaml.cs comme ceci :
public partial class Window1 : MotherWindow
Le compilateur va nous retourner une erreur, car l’élément racine du fichier xaml correspondant précise la classe mère dont doit hériter la classe Window1.
Il suffit donc de le changer lui aussi, en définissant aussi un espace de nom dans le fichier xaml :
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Heritage"
Title="Window1" Height="300" Width="300">
<Grid>
</Grid>
</local:CloseMove>
Sans oublier bien sûr de préciser parmi les espaces de noms que local correspond à notre assembly.
Passons maintenant aux Storyboards en XAML.
Il arrive parfois que l’on veuille faire référence à une propriété d’un enfant d’une Window, d’une Page ou d’un UserControl dans un Storyboard situé dans les ressources de celui-ci.
Pour y arriver, il suffit de préciser l’attribut Storyboard.TargetName avec le nom x:Name de l’enfant et ensuite de préciser sa propriété comme on le ferait normalement dans l’attribut Storyboard.targetProperty d’une balise AnimationUsingKeyFrames :
<ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="border" Storyboard.TargetProperty="Background">
En ayant bien sûr précisé le x:Name de la Border :
<Border x:Name="border">
Et pour appeler un Storyboard défini dans un fichier xml à partir du code, il suffit d’utiliser la méthode beginStoryboard avec le nom du Storyboard :
this.BeginStoryboard((Storyboard)this.FindResource("myStoryboard"));
Au final, rien de bien compliqué en soit, mais que l’on peut chercher durant un moment si on ne le sait pas.