WPF Unités et le Code-Behind
-
14-11-2019 - |
Question
Récemment, j'ai découvert WPF prend en charge les différentes unités de mesure dans le code XAML.Outre le défaut de Trempettes, il y a aussi un support pour les pixels, pouces et en centimètres (autant que je sache).Cela permet au concepteur d'écrire XAML comme ceci:
<Canvas>
<Line X1="0cm" X2="3cm" Y1="1cm" Y2="3cm" Stroke="Black"/>
</Canvas>
Cependant, vous ne pouvez pas lier ces valeurs.Imaginons que nous ayons un ViewModel, avec la Dimension de la propriété qui est une Chaîne de caractères, par exemple "7cm".Suivant ne fonctionne pas:
<Button Width="{Binding Dimension}">Test</Button>
FormatException est lancée.De même, lors de la création d'un FrameworkElement
dans le code-behind, comme ceci:
Canvas1.Children.Add(new Button() { Width = "3cm", Content = "Test"});
Compilation échoue parce que l'exception est levée dans le constructeur/où que vous essayez de créer le contrôle.
Je me demande:
- Est-il possible d'utiliser des unités naturelles (dans mon cas, les mesures en centimètres) dans le code-behind?
- Comment?
- Est-il une liste complète des unités de WPF/XAML prend en charge?
EDIT:
Voici un lien de commentaire ci-dessous, ce qui résout cette question:
http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.width.aspx
La solution
Vous pouvez le faire dans le code derrière en appliquant la même conversion, le XAML-analyseur utilise, vous n'avez pas besoin de ré-écrire cette logique si vous n'avez pas l'esprit en passant autour des chaînes:
button.Width = (double)new LengthConverter().ConvertFrom("2cm");
Le code XAML-analyseur utilise TypeConverters pour convertir des chaînes les valeurs nécessaires, dans le page de documentation du Width
propriété vous pouvez voir qu'il a un TypeConverterAttribute
précisant qu'une LengthConverter
doit être utilisé.Cet attribut peut être utilisé localement modifier la manière dont une propriété doit être traitée, mais elle peut aussi être appliquée au niveau de la classe, de sorte que si un Employee
classe a cet attribut spécifiant que la EmployeeConverter
doit être utilisé ce convertisseur sera la valeur par défaut pour les propriétés de type Employee
.
Je suis un peu surpris de la liaison ne s'applique pas à ce type de convertisseur, mais l'utiliser à l'intérieur d'un IValueConverter
serait assez simple, en fait, vous pourriez créer un extension de balisage qui construit une IValueConverter
à partir d'un convertisseur de type pour le rendre bien générique.
Autres conseils
Pour 1) et 2) Parce que les Trempettes sont indépendants du périphérique, vous pouvez calculer les "unités naturelles" et de sans problèmes.Les exceptions sont les (non naturelle :) dépend de l'appareil pixels.
Créer un ValueConverter qui convertit les valeurs de chaîne à double où vos unités peuvent être spécifiée dans la chaîne.Ensuite, vous pouvez utiliser le ValueConverter dans votre Liaison et de calculer dans votre ViewModel en "unités naturelles".
Pour la 3) et la mise en œuvre:J'ai rapidement cherché sur google et rien trouvé, mais peut-être qu'une recherche plus approfondie montrer quelque chose.Sinon, la création de votre propre convertisseur ne doit pas être très difficile.Ici certains de conversion infos:
96DIP == 1inch == 2.54cm;
1cm == 37.8DIP;
1zoll == 1inch == 2.54cm;