2009-02-24 8 views
3

J'essaye de rendre du XAML à l'exécution. Mon XAML est construit dynamiquement dans un StringBuilder. À titre d'exemple, voici un échantillon:Générer une image au moment de l'exécution

StringBuilder xaml = new StringBuilder(); 
xaml.Append("<Canvas xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" "); 
xaml.Append("xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" Height=\"135\" "); 
xaml.Append("Width=\"210\" Background=\"White\" x:Name=\"Page\">"); 

string url = "http://www.mydomain.com/images/background.png"; 
xaml.Append("<Image Width=\"300\" Height=\"200\" Canvas.Left=\"0\" Canvas.Top=\"0\" "); 
xaml.Append("x:Name=\"bgImage\" Source=\""); 
xaml.Append(url); 
xaml.Append("\" />"); 

xaml.Append("</Canvas>"); 

S'il vous plaît noter l'élément d'image dans cet échantillon. Si je mets ce XAML dans un fichier .xaml cela fonctionne bien. Si je le colle dans Blend, cela fonctionne très bien. Cependant, j'ai besoin d'attendre que cette image soit téléchargée et ensuite convertir le XAML rendu en .png. Pour ce faire, je suis en utilisant le code suivant:

StringReader stringReader = new StringReader(xaml.ToString()); 
XmlTextReader xmlReader = new XmlTextReader(stringReader); 
FrameworkElement frameworkElement = (FrameworkElement)(XamlReader.Load(xmlReader)); 
Size availableSize = new Size(300, 200); 
frameworkElement.Measure(availableSize); 
frameworkElement.Arrange(new Rect(availableSize)); 

BitmapSource bitmap = RenderToBitmap(frameworkElement); 
PngBitmapEncoder encoder = new PngBitmapEncoder(); 
encoder.Frames.Add(BitmapFrame.Create(bitmap)); 

FileStream fileStream = new FileStream(filename, FileMode.Create); 
encoder.Save(fileStream); 
fileStream.Close(); 

Le problème est, le .png généré ignore toujours l'élément d'image. Je devine parce que la source d'image n'est pas téléchargée. Comment puis-je générer une image à partir de XAML à l'exécution qui inclut une image?

Merci

Répondre

2

Pourquoi ne pas simplement générer l'objet directement en C# au lieu de créer XAML et ayant le temps d'exécution ont pour l'analyser? Cette méthode présente les avantages suivants:

  1. Vérification à la compilation de vos objets. La façon dont vous le faites maintenant peut introduire des erreurs d'exécution en raison d'un gros doigté, etc.
  2. Création d'objet plus rapide. L'instanciation des objets directement dans C# sera plus rapide que l'analyseur.
  3. Plus maintenable. Le prochain programmeur à venir et travailler avec ce code aura un temps plus facile avec C# bien mis en forme contre XAML incorporé.
  4. Refactorisable. Vous pouvez refactoriser votre code C# pour éliminer le code répétitif.
+0

La raison en est que le code XAML est généré dynamiquement. Le code réel est plus complexe que ce qui est montré. La vitesse n'est pas un problème car le code XAML est utilisé sur un thread asynchrone pour générer un .png à partir du code XAML. Ma préoccupation est cependant de montrer une image si une image est utilisée. – user70192

0

Il peut être plus facile de charger l'image vous-même, puis de l'affecter directement à l'objet Image généré. Le FrameworkElement créé à partir du XAML a un nom x: Name pour l'occurrence Image et vous pouvez donc facilement le trouver et l'affecter directement. De cette façon, vous chargez l'image de manière synchrone et ne répondez pas lorsqu'elle est chargée en arrière-plan sur laquelle vous n'avez aucun contrôle réel.

Questions connexes