WPF : COMMENT FAIRE RAPIDEMENT UN USER CONTROLE REUTILISABLE

WPF : COMMENT FAIRE RAPIDEMENT UN USER CONTROLE

REUTILISABLE

Auteur :Hassan KANDIL

Date de la premire publication :12/04/2010

Revue et adapte le : 02/07/2017

Pour raliser un contr?le utilisateur en WPF, Les mthodes sont multiples et efficaces. A commencer par le style et les templates du

zammel jusqu lcriture en VB, C++ ou C# dun code qui gre laffichage de lobjet et son comportement.

Bien s?r nous devons garder en tte avant de commencer lcriture de lobjet, quil y a toujours un objet (ou plusieurs) qui peuvent

servir comme anctres de notre objet et donc, il vaut mieux se baser sur lexistant pour gnrer un nouvel objet.

Lexemple que jai choisi dexposer ici, montre un objet dune utilit moyenne mais avec quelques modifications des images il

pourrait savrer trs utile.

Cet exemple tentera de raliser un bouton rond avec des aspects ? bitmaps ?. Il ne prtend pas tre le plus ergonomique, mais il

pourra tre un exemple dune ralisation trs facile.

La premire question qui se pose est sur lutilisation des ressources dans un contr?le utilisateur. Il faut que les ressources soient

incorpores, or WPF incorpore automatiquement les ressources, moins que lon veuille les inclure dans un dictionnaire de

ressources, et dans ce cas, il faut assurer lajout du dictionnaire au projet (merging), ce qui me semble non adapt la situation,

surtout quun objet de cette nature ne doit pas tra?ner beaucoup de ressources, pour des raisons defficacit

Bouton Rond.

Notre Contr?le utilisateur est un bouton rond cliquable . Il a quatre aspects diffrents :

En tat de repos

Pendant le click

Nom utiliser dans la cl

bleu

elastique

rouge

vrai

.

ce qui reprsente 8 fichiers dimages diffrentes,

Le traitement regroupe les images 2 par 2 en utilisant un prfixe suivi dune description identique Origine (repos) C

Destination(cliqu) . Ceci est utile dans la constitution de la cl de limage dans le fichier XAML.

Comme on a dit, les objets graphiques seront inclus dans le contr?le utilisateur Do la dfinition du qui contiendra

cette partie de ressources.

Ceci suppose que les huit fichiers sont placs dans un dossier Images au sein du projet WPF.

Les noms des fichiers importent peu, seuls les cls doivent tre structures dune manire pouvoir les reconstituer facilement partir

de la couleur. Lide est de considrer la cl comme tant couleur+cha?ne constante (Origine ou Destination)

Le bouton devrait contenir une template qui permettra de le dessiner et de dfinir la partie qui nous intresse de son comportement :

Changement daspect (image) quand il est cliqu.

Commen?ons dj par la cration du template et donnons un nom Cl cette cration et bien s?r un target type pour lappliquer

notre futur objet

Dessinons un aspect rond

Nous ne mettons pas de Height ni Width dans lellipse, mais nous savons que notre bouton devrait avoir

la mme valeur pour ces deux proprits. Nous pouvons lier la taille de lellipse la taille de

lobjet en ajoutant

Height="{Binding ElementName=BRUser,Path=Height}" Width="{Binding ElementName=BRUser,Path=Width}">.

BRUser tant le nom du bouton que lon utilisera dans le UserControl (ce nom sera interne lobjet).

Pour le moment remplissons notre Ellipse(circulaire) par limage au repos, laquelle est une variable

objet que lon nommera FileOrigine. Cet objet fera partie du code behind et assurera la transmission de

limage approprie.

Lobjectif de la RelativeSource={RelativeSource AncestorType=UserControl est tout simplement de

signaler llment origine de la data cest dire notre UserControl. Ceci nous vitera de dfinir le

DataContext plus tard pour pouvoir utiliser notre objet.

Un event nous intresse particulirement :la souris clique. On peut aussi sintresser dautres events (le mouse over par exemple).

2 proprits : IsPressed (le bouton est cliqu ou valid par le clavier) et IsMouseOver (la souris survole lobjet).

La valeur ? True ? de chacune de ces proprits doit dclencher des actions qui seront accomplies travers des triggers et des setter

property-value. Le trigger indique levent, le setter avec TargetName indique la proprit et sa valeur. Ceci se fait de la manire

suivante.

Pour le mouse over nous allons nous contenter de jouer sur la couleur du stroke(le bord de lellipse)

en le rendant rouge. Rien nempche dajouter une troisime image pour cette situation ou de faire des

transformations (rduction/agrandissement ou autres).

Les deux vnements sont traits, nous devons fermer les balises

Pour dfinir lobjet du Template on va utiliser le layout StackPanel et ne pas oublier la taille

donner au bouton qui sera le mme attribu lellipse.

Le click est levent qui sera trait dans notre programme qui exploitera plus tard le bouton rond.

Note : En fait rien ne nous empche de le faire elliptique en donnant Width une valeur diffrente de

Height.

Le bouton est dessin Le fichier XAML est le suivant:

La gestion des Mthodes permettant cette liaison cre avec FileOrigine et FileDestination doit tre assure dans le code behind.

Lentte de ce fichier contiendra les using suivants (importations) :

using

using

using

using

using

using

using

using

using

using

using

using

using

using

using

System;

System.Collections.Generic;

System.Linq;

System.Text;

System.Threading.Tasks;

System.Windows;

System.Windows.Controls;

ponentModel;

System.Windows.Data;

System.Windows.Documents;

System.Windows.Input;

System.Windows.Media;

System.Windows.Media.Imaging;

System.Windows.Navigation;

System.Windows.Shapes;

Remarquons que ces deux lments doivent retourner des ImageSource Si elles ntaient pas capables de lassurer, on aurait fait

appel un converter qui transformera la ressource en imageSource ou BitmapImage qui sera retourne au Binding. Ceci aurait exig

dajouter dans le binding llment Converter={staticResource nomdfinidanslesUserResources}.

Il y aura lieu dans ce cas ajouter une classe drive de IValueConverter avec les deux mthodes Convert et ConvertBack.

Le code Behind doit contenir tout simplement Une dependency property (ce nest pas la seule fa?on de faire une

INotifyPropertyChanged aurait ralis la t?che).

Mais Le changement de laspect du bouton sera moins lgant que de le faire travers une dependency

property qui peut figurer directement dans le XAML de la fentre owner du usercontrol.

La dfinition des deux attributs qui contiendront la ressource est le premier pas raliser dans le

code behind

#region Dfinitions

private ImageSource fileOrigine;

private ImageSource fileDestination;

#endregion

Il faut aussi dfinir une proprit nomme Couleur (Aspect aurait mieux correspondu notre cas) qui

re?oit les valeurs : bleu/rouge/elastique/vrai et qui dfinit laspect du bouton.

Une approche intuitive nous pousse dfinir les valeurs possibles (gres) de la proprit Couleur.

Pour ce faire nous utilisons une list qui contiendra toutes les valeurs autorises. Dans notre

cas, quatre valeurs (bleu/rouge/elastique/vrai) sont stocker dans la liste. Cette liste est unique,

elle ne doit pas tre rgnre chaque instanciation du contr?le. Cest pour cette raison quelle est

dfinie en static. En plus elle pourrait tre exploite sans instanciation.

public static List Couleurs = new List();

Pour remplir cette liste, on pourrait procder de plusieurs fa?ons, une des plus simples est de le

faire dans le constructeur et de sassurer que cette opration nest pas reproduite chaque

instanciation.

#region Constructer

public BoutonRond()

{

if (Couleurs.Count() == 0)

{

//dans un ordre croissant pour utiliser System.Array.BinarySearch(tab, Couleur)

Couleurs.Add("bleu");

Couleurs.Add("elastique");

Couleurs.Add("rouge");

Couleurs.Add("vrai");

}

InitializeComponent();

}

#endregion

Les lments du DataBinding sont au nombre de deux FileOrigine et FileDestination

Ces deux lments doivent tout simplement reconna?tre le choix fait par la proprit dpendante Couleur

et associer le fichier Bitmap correspondant.

Pour cela on peut utiliser indiffremment Ressources(qui pourrait tre utilise aussi avec un

dictionnaire de resources) et FindRessource (pareil).

Lapproche dans ce cas utilisera Application.Current.FindResource (ou resources[]) et procdera

limport des ressources soit dans lapplication soit dans un dictionnaire partag.

Or nos ressources se trouvent dans le usercontrol XAML, donc on y accde avec this qui reprsente dans

le code behind le usercontrole

Ces deux mthodes daccs (resources[] et FindResource() ont besoin de la cl de la ressource

recherche).

Cette cl est Constitue de la Couleur+le mot Origine ou le mot Destination (daprs notre vision

algorithmique.)

La construction de limage peut se faire avec le set ou au moment du get ou mme un autre moment (au

moment du changement de la valeur de Couleur)

#region DataBinding Elments

public ImageSource FileOrigine

{

get

{

fileOrigine = ((ImageBrush)this.FindResource(Couleur + "Origine")).ImageSource;

return fileOrigine;

}

set

{

fileOrigine = value;

NotifyPropertyChange("FileOrigine");

}

}

public ImageSource FileDestination

{

get

{

fileDestination = ((ImageBrush)this.Resources[Couleur + "Destination"]).ImageSource;

return fileDestination;

}

set

................
................

In order to avoid copyright disputes, this page is only a partial summary.

Google Online Preview   Download