Je prends Silverlight XAML et l'envoie à un service Web qui rend le XAML dans un thread STA et génère une image PNG. Tout le rendu XAML correctement, sauf les <image>
entrées qui «apparaissent» pour charger correctement lorsque leur propriété Source
est définie dans WPF mais le PNG n'affiche pas l'image référencée - qu'est-ce que je fais mal?Comment rendre un <image> dans un processus WPF en arrière-plan?
Le cœur du code que j'utilise est le suivant. L'objet value
est un objet DTO de Silverlight qui contient le code XAML dans la chaîne qui se termine par la propriété locale sXAML
et l'image URI par la propriété value.ImageURL
.
var canvas = (FrameworkElement)XamlReader.Load(new XmlTextReader(new StringReader(sXAML)));
var obj = canvas.FindName("BGImage");
Image img = null;
if (obj != null)
{
img = obj as Image;
img.ImageFailed += img_ImageFailed;
img.Source = new BitmapImage(new Uri(value.ImageURL, UriKind.Absolute));
}
canvas.Arrange(new Rect(new Size(463d, 381d)));
canvas.UpdateLayout();
var mem = new MemoryStream();
var bmp = new RenderTargetBitmap(463, 381, 96d, 96d, PixelFormats.Pbgra32);
bmp.Render(canvas);
var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bmp));
encoder.Save(mem);
FileStream fs = new FileStream("D:\\out.png", FileMode.Create);
mem.WriteTo(fs);
fs.Close();
NB: Le gestionnaire d'événements img_ImageFailed
est jamais appelé indiquant que la cession img
Source a réussi en quelque sorte.
Impossible d'obtenir WPF pour rendre l'image d'arrière-plan - ne vous inquiétez pas. J'ai chargé l'image d'arrière-plan dans une image bitmap et l'ai modifiée avec l'image bitmap XAML rendue et générée avec succès l'image désirée. – user22096