Share via


Astuce Silverlight : comment charger un contrôle XAML depuis un fichier ou une chaîne de caractères ? - #S004

image image  

Si vous avez un contrôle écrit en XAML qui est inclus dans votre projet, vous pouvez le charger et le créer directement depuis le fichier en utilisant la méthode :

System.Windows.Markup.XamlReader.Load()

Cette méthode peut également être utilisée pour créer directement un contrôle Silverlight depuis une chaîne de caractères.

Pour le démontrer j’ai créé deux fonctions appelées LoadFromXAML(). La première fonction prend en paramètre une URI qui pointe vers le fichier XAML que vous voulez charger dans votre projet. La seconde prend en paramètre une chaîne de caractères qui représente le contrôle.

 public static object LoadFromXaml(Uri uri)
{
    System.Windows.Resources.StreamResourceInfo streamInfo = System.Windows.Application.GetResourceStream(uri);
 
    if ((streamInfo != null) && (streamInfo.Stream != null))
    {
        using (System.IO.StreamReader reader = new System.IO.StreamReader(streamInfo.Stream))
        {
            return System.Windows.Markup.XamlReader.Load(reader.ReadToEnd());
        }
    }
 
    return null;
}
public static object LoadFromXamlString(string xamlControl)
{
    return System.Windows.Markup.XamlReader.Load(xamlControl);
}

La méthode ci-dessus retourne un objet générique dont le type peut être casté en celui de l’objet dont vous êtes en train de charger.
Par exemple :

Button myButton = (Button)LoadFromXaml(new Uri("/LoadXaml;component/MyButton.xaml", UriKind.Relative));

ou

string buttonXAML = "<Button xmlns='https://schemas.microsoft.com/client/2007' Width=\"100\" Height=\"100\" Content=\"Click Me\"></Button>";

Button myButton = (Button) LoadFromXaml(buttonXAML);

Remarquez que dans le code XAML vous devez déclarer un espace de nom XML par défaut comme surligné ci-dessous :

<Button xmlns='https://schemas.microsoft.com/client/2007' Width="100" Height="100" Content="Click Me"></Button>

Si vous ne déclarez pas cet espace de nom, vous verrez l’erreur suivante :

AG_E_PARSER_MISSING_DEFAULT_NAMESPACE [Line: 0 Position: 0]

Syndication : Mike Snow’s Weblog
Traduction autorisée par Mike Snow.