Accéder aux objets et leurs propriétés
Les balises XAML sont accédées par le code JavaScript selon le DOM comme en HTML. Mais des différences existent quand aux gestionnaires d'évènements.
Les gestionnaires d'évènements
Ce sont les fonctions que l'on assigne par leur nom aux évènements
prédéfinis de XAML. Par exemple à Click, on assigne
clicme qui est le nom d'une fonction devant être exécutée
lorsque l'évènement se produit, autrement dit lorsque l'utilisateur
clique sur le bouton de la souris.
Ces gestionnaires d'évènement ont des paramètres prédéfinis:
- sender, le nom de l'objet auquel est associé l'évènement,
par exemple le rectangle à l'intérieur duquel on clique sur
la souris.
- args, un paramètre dont la classe dépend de l'évènement.
Accéder aux éléments internes
Pour accéder aux parties d'un objet, on utilise directement leurs
noms, contrairement à ce qui se passe avec Silverlight.
Il faut donc pour cela avoir donné un nom à l'objet, cela avec
l'attribut:
x:Name
Exemple:
<Window Click="clicButton"> <Button x:Name="clicme" /> </Window>
La fonction C#:
void clicButton(object sender, EventArgs args) { object x = clicme; }
Accéder à un élément XAML quelconque
Si l'on veut accéder à une élément XAML quelconque
dans le fichier, il ne pourra pas être accédé à
partir du pointeur sender.
Mais on peut créer une variable globale pour accéder
aux élement d'un objet ActiveX, avec cette ligne:
var application = document.getElementById("monControle");
La variable "application", que l'on peut nommer comme on voudra en fait, remplacera sender, ainsi l'instruction suivante est équivalente à celle qui utilise sender dans l'exemple précédent:
function uneFonction() { var r = application.FindName("rect"); }
Accéder aux propriétés
On accède aux propriétés des objets en utilisant le nom de la propriété comme indice, et cela même s'il s'agit d'une propriété attachée:
<Canvas MouseLeftButtonDown="clicRect"> <Rectangle x:Name="rect" Canvas.Top="10" Canvas.Left="20" </Rectangle> </Canvas>
et la fonction:
function clicRect(sender, args) { var r = sender.FindName("rect"); alert("Top=" + r["Canvas.Top"]); }
On voit que la propriété Canvas.Top est indice de l'objet r qui pointe sur l'élément Rectangle de nom rect et la fonction alert affiche donc la position verticale du rectangle dans le Canvas.
Autre exemple avec un bouton et un bloc de texte:
<Canvas x:Name="LayoutRoot" Width="400"> <Button x:Name="clicme" Width="128" Height="20" Canvas.Left="24" Canvas.Top="20" Content="Clique moi" Click="clicButton" /> <TextBlock x:Name="disp" Height = "20" Width = "128" Background="#FF4ED2D5" Text="Rien" Canvas.Left="24" Canvas.Top="50" /> </Canvas>
On crée une fonction:
private void clicButton(object sender, EventArgs e) { disp.Text = "Merci"; clicme.Content = "Clique encore"; }
On voit que la propriété Content est associée directement au nom du bouton "clicme", de même la propriété Text est associée au nom du block de texte "disp", ainsi la fonction clicButton peut changer ce qu'affiche le programme en assignant quelque chose à ces propriétés.
Dans l'exemple, quand on clique sur le bouton, le champ de texte qui contenait "Rien" contient maintenant "Merci", et le bouton change aussi, il affichait "Clique moi", il affiche maintenant "Clique encore".
Démonstration avec un rectangle
Le code source complet:
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
MouseLeftButtonDown="clicRect"
>
<Rectangle
x:Name="rect"
Canvas.Top="10"
Canvas.Left="20"
Stroke="Black"
Width="100"
Height="30"
Fill="LightBlue"
/>
</Canvas> function clicRect(sender, args)
{
var r = sender.FindName("rect");
alert("Top=" + r["Canvas.Top"]);
}
Les fichiers du code...
- Le code XAML.
- Le code JavaScript.