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.
To fulfill the demand for quickly locating and searching documents.
It is intelligent file search solution for home and business.
Related download
- tch worksheets studyladder
- wpf relativesource templatedparent example
- gjtxgtcpuvcnvwpigp wpf 8qtvt ig
- world pressure filters parker hannifin
- wpf comment faire rapidement un user controle reutilisable
- flexgrid for wpf grapecity
- xaml for wpf cheat sheet
- an architecture for wpf applications pdsa
- wpf tutorials point
- windows presentation foundation
Related searches
- how to comment on your performance r
- how to comment on your performance review
- comment codes stars classroom nyc
- how to comment on facebook
- stars classroom comment codes
- how to comment on pdf
- how to comment on youtube
- excellent customer service comment example
- customer comment examples
- javascript comment function
- javascript function comment standards
- javascript function comment style