2009-09-04 6 views
0

J'ai quelques interneCanevas Fichiers xaml que je veux charger dynamiquement à l'exécution. Par exemple, je souhaite afficher le Canevas dans une page. Cependant, je n'arrive pas à le faire fonctionner. J'ai essayé d'utiliser XamlReader, Application.LoadComponent, et en utilisant un XDocument; Tout en rien. Je ne peux pas trouver la meilleure pratique pour cela en ligne non plus.Comment charger dynamiquement xaml interne dans Silverlight 3 lors de l'exécution?

Les toiles sont stockées comme suit: MyApp/Resources/Logos/Logo1.xaml. Je ne suis pas sûr si Logo1.xaml devrait avoir une action de construction de "Component" ou "Resource". Dans tous les cas, en utilisant l'URI de "MyApp; composants/Ressources/Logos/Logo1.xaml" semble être correct, mais Application.LoadComponent obtient un XamlParseException à la ligne 0 Position 0.

Voici un pseudo-exemple de Logo1.xaml:

<Canvas 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width="286.233" Height="143.425"> 

    <Canvas> 

     <Path /> 

     <Path /> 

     <Path /> 

     <Path /> 

    </Canvas> 
</Canvas> 

Les données pour les éléments de chemin ont été omises par souci de concision.

Des idées?

+0

La voie normale est d'utiliser 'XamlReader'. Quelle erreur obtenez-vous? –

+0

Il y a un chapitre entier sur ceci dans mon livre de Silverlight qui est malheureusement à la maison en ce moment. Ce soir (dans environ quatre heures) je peux vous donner autant d'informations que vous le souhaitez. –

+0

Je ne connais pas la réponse mais cet exemple le fait peut-être que cela aidera http://silverlight.net/samples/sl2/dlrconsole/index.html. – sipwiz

Répondre

3

J'ai eu ce à travailler à l'aide de construire une action « ressources » et le XamlLoader avec un ContentControl:

var resourceName = string.Format("MyApp;component/Resources/Logos/{0}.xaml", logoName); 
var uri = new Uri(resourceName, UriKind.Relative); 
var streamResourceInfo = Application.GetResourceStream(uri); 

string xaml = null; 

using (var resourceStream = streamResourceInfo.Stream) 
{ 
    using (var streamReader = new StreamReader(resourceStream)) 
    { 
     xaml = streamReader.ReadToEnd(); 
    } 
} 

Canvas canvas = XamlReader.Load(xaml) as Canvas; 

this.contentControl.Content = canvas; 
2

Le accepted answer n'est pas intuitif pour moi, mais peut convenir à certaines personnes. Je me sens généralement plus à l'aise avec System.IO.File.WriteAllText et System.IO.File.ReadAllText. J'ai emprunté un morceau de code de MSDN. Pour un test, il suffit de créer une nouvelle toile à l'exécution:

Canvas newCanvas = new Canvas() 

Ensuite, il suffit d'écrire dehors, avec File.WriteAllText, simple aussi, en évitant tous les trucs URI, qui, comme un débutant, je trouve déroutant. Enfin, il suffit de le lire comme ci-dessus. Terminé. Cela prouve que vous pouvez simplement lire dans un code valide pour un canevas à partir d'un fichier texte, et il peut être chargé dynamiquement.

private void Button2_Click(object sender, RoutedEventArgs e) 
{ 
    Canvas newCanvas = new Canvas(); 
    newCanvas.Name = "newCanvas"; 
    string savedCanvas = XamlWriter.Save(newCanvas); 
    File.WriteAllText("savedCanvas.txt", savedCanvas); 
    savedCanvas = File.ReadAllText("savedCanvas.txt"); 
    // Load the canvas 
    StringReader stringReader2 = new StringReader(savedCanvas); 
    XmlReader xmlReader2 = XmlReader.Create(stringReader2); 
    Canvas newCreatedCanvas = (Canvas)XamlReader.Load(xmlReader2); 
    this.Content = newCreatedCanvas; 
} 

Les idées sont from MSDN comme ci-dessous:

XamlReader.Load Méthode (XmlReader)

Framework 4

Lit l'entrée de XAML dans le XmlReader spécifié et renvoie un objet qui est la racine de l'arbre objet correspondant.

espace de noms:System.Windows.Markup

Assembly: PresentationFramework (en PresentationFramework.dll)

Questions connexes