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

Était-ce utile?

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top