2009-07-31 10 views
3

Comment l'analyseur XAML convertit-il la chaîne "Red" dans Foreground = "Red" en SolidColorBrush? Bien que je sache que les types ont System.ComponentModel.TypeConverter défini, je pense que l'analyseur XAML de WPF utilise toujours ceux-ci pour convertir la chaîne à la brosse. Existe-t-il des API XAML en dehors de XamlReader.Load (qui veut une chaîne xml valide) que je pourrais utiliser pour analyser une seule chaîne comme si elle avait un attribut pour une certaine propriété?Analyser manuellement la chaîne en tant qu'attribut XAML

Répondre

-1

Je crois que vous pouvez profiter de cela vous-même. XamlReader connaît le type de cible (le type de la propriété à laquelle la chaîne doit être appliquée). Vous devez enregistrer un TypeConverter pour le type de cette propriété.

EDIT cela fonctionnera pour vous quand il vient à SolidColorBrush:

var colorString = ...; 
var converter = new System.Windows.Media.BrushConverter(); 
var brush = (SolidColorBrush)converter.ConvertFromString(colorString); 

semble à la recherche, il SolidColorBrush dans le réflecteur .NET, la magie qui fait désérialisation au sein XamlReader utilise des API internes autour de types connus. Je ne suis pas sûr que vous puissiez enregistrer vos propres types pour gérer cela.

+0

Oui, c'est comme ça que je le fais actuellement. Mais j'ai remarqué que XamlReader n'utilise pas toujours les TypeConverters pour analyser la chaîne. Le XamlReader doit donc avoir plus de logique pour l'analyse en dehors de ces convertisseurs de type. Ma question est-elle exposée en tant qu'API quelque part? – bitbonk

0

L'analyseur XAML (pour WPF) utilise réellement le convertisseur de type de la propriété ou du type de propriété spécifié. Il y a quelques raccourcis codés en dur mais ils sont pour la performance et ne changent pas la sémantique. Un analyseur, utilisant simplement des informations d'attribut, peut dupliquer la sémantique de l'analyseur (ce qui est, par exemple, ce que font Blend et Cider).

Il n'y a pas d'API qui convertira une valeur exactement comme le ferait XAML principalement parce que beaucoup de types convertis ne fonctionnent que dans le contexte d'une analyse XAML. Par exemple, les convertisseurs de type peuvent se référer aux espaces de noms définis dans le fichier XAML (qui varie en fonction de l'emplacement de la valeur dans le fichier XML) ainsi que d'autres bases URI de base d'informations ambiantes pour le fichier. Ceux-ci ne sont vraiment applicables que lorsque le fichier XAML est en cours d'analyse. Le plus proche que vous pouvez trouver est de demander le descripteur de propriété pour la propriété à partir du descripteur de type et en utilisant la propriété Convertisseur. Cela va scanner les attributs appropriés pour créer le convertisseur de type correct.

Questions connexes