67 votes

Comment définir une variable dans XAML ?

J'ai les deux boutons suivants dans XAML :

<Button Content="Previous"
        Margin="10,0,0,10"/>
<Button Content="Next"
        Margin="0,0,10,10"/>

Comment puis-je définir "10" comme une variable afin de pouvoir le changer à un seul endroit, quelque chose comme ceci :

CODE PSEUDO :

<variable x:key="theMargin"/>
<Button Content="Previous"
        Margin="{Variable theMargin},0,0,{Variable theMargin}"/>
<Button Content="Next"
        Margin="0,0,{Variable theMargin},{Variable theMargin}"/>

111voto

Sorskoot Points 5882

Essayez ça :

ajouter à l'en-tête du xamlfile

xmlns:System="clr-namespace:System;assembly=mscorlib"

Ajoutez ensuite ceci à la section des ressources :

<System:Double x:Key="theMargin">2.35</System:Double>

Enfin, utilisez une épaisseur sur la marge :

<Button Content="Next">
   <Button.Margin>
      <Thickness Top="{StaticResource theMargin}" Left="0" Right="0"
                  Bottom ="{StaticResource theMargin}" />
   </Button.Margin>
</Button>

De nombreux types de systèmes peuvent être définis de cette manière : int, char, string, DateTime, etc.

Note : Tu as raison... J'ai dû faire de meilleurs tests... j'ai modifié le code pour qu'il fonctionne...

2 votes

Hmmm, j'ai ajouté <System:Double x:Key="theMargin">2.35</System:Double> dans Window.Resources et j'ai obtenu "System:Double was not found", j'ai ajouté "System" comme référence mais ça n'a pas aidé, qu'est-ce que je rate ?

0 votes

Double n'apparaît pas dans la liste déroulante, seulement "RegistryHive" et trois autres, j'ai référencé System.Core, que dois-je référencer d'autre ?

2 votes

J'ai trouvé mon problème : J'ajoutais ce xmlns:System="clr-namespace:Microsoft.Win32;assembly=mscorlib" et j'aurais dû ajouter ceci : xmlns:System="clr-namespace:System;assembly=mscorlib".

7voto

CodyF Points 2275

De façon similaire à la réponse de Sorskoot, vous pouvez ajouter une ressource d'épaisseur à utiliser, définissant ainsi chaque direction de marge indépendamment.

<UserControl.Resources>
    <Thickness x:Key="myMargin" Top="5" Left="10" Right="10" Bottom ="5"></Thickness>
</UserControl.Resources>

Il suffit ensuite d'utiliser l'épaisseur comme marge :

<Button Content="Next" Margin="{StaticResource myMargin}"/>

1voto

inkubpl Points 41

Vous devez l'invoquer avant InitializeComponent ou utiliser l'interface INotifyPropertyChanged après cela.

1voto

Andrew Hare Points 159332

Pourquoi n'essayez-vous pas d'ajouter la valeur en tant que StaticResource ?

Resources.Add("theMargin", 10);

Vous pouvez alors obtenir cette valeur comme ceci :

<Button Content="Previous"
        Margin="{StaticResource theMargin},0,0,{StaticResource theMargin}"/>
<Button Content="Next"
        Margin="0,0,{StaticResource theMargin},{StaticResource theMargin}"/>

2 votes

J'ai ajouté Resources.Add("theMargin", 50) ; après InitializeComponent dans mon code derrière, mais XAML ne pouvait pas y accéder.

0 votes

Le texte ',0,0,{StaticResource theMargin}' n'est pas autorisé après le '}' de fermeture d'une expression MarkupExtension.

0voto

mihails.kuzmins Points 320

Dans .NET Core, la réponse de @Sorskoot fonctionnait, mais produisait un avertissement. À la place, j'ai donc utilisé cette déclaration d'espace de nom :

xmlns:system="clr-namespace:System;assembly=System.Runtime"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X