Sto cercando di creare alcune immagini di grafici senza mai visualizzare quei grafici sullo schermo. Sono stato a questo per un po 'e ho provato un sacco di cose diverse ma niente sembra funzionare. Il codice funziona perfettamente se visualizzo il grafico in una finestra per primo, ma se non lo visualizzo in una finestra, la bitmap è solo bianca con un bordo nero (nessuna idea del perché).ContentControl + RenderTargetBitmap + immagine vuota
Ho provato ad aggiungere il grafico a un bordo prima del rendering e a dare al bordo un bordo verde. Nella bitmap, vedo il borderBrush verde, quindi il bordo nero e lo sfondo bianco ma nessun grafico. Il Chart non è contenuto in un boarder nero quindi non so da dove viene.
Ho provato ad aggiungere il grafico a una finestra senza chiamare window.Show() e di nuovo ho appena ottenuto il boarder nero e lo sfondo bianco. Tuttavia se chiamo window.Show() la bitmap contiene il grafico.
Ho provato a utilizzare un disegnoVisuale come spiegato here, stesso risultato.
Ecco il codice (non inclusa l'aggiunta dell'elemento da un bordo o finestra):
private static BitmapSource CreateElementScreenshot(FrameworkElement element, int dpi)
{
if (!element.IsMeasureValid)
{
Size size = new Size(element.Width, element.Height);
element.Measure(size);
element.Arrange(new Rect(size));
}
element.UpdateLayout();
var scale = dpi/96.0;
var renderTargetBitmap = new RenderTargetBitmap
(
(int)(scale * element.RenderSize.Width),(int)(scale * element.RenderSize.Height),dpi,dpi,PixelFormats.Default
);
// this is waiting for dispatcher to perform measure, arrange and render passes
element.Dispatcher.Invoke(((Action)(() => renderTargetBitmap.Render(element))), DispatcherPriority.Render);
return renderTargetBitmap;
}
Nota: Il grafico è un ContentControl.
Esiste comunque la possibilità di visualizzare il grafico senza visualizzarlo prima in una finestra?
Non funziona per me. Dove hai inserito nel tuo codice la funzione ApplyTemplate? –
Scusa sono passati due anni da quando ho risposto a questo e non ho più accesso a quel codice. Prova ad aggiungerlo prima di UpdateLayout – Kelly
Grazie per aver postato la risposta. Mi hai salvato un sacco di problemi! :) – ihake