Ho avuto problemi con la stampa utilizzando lo spazio dei nomi System.Printing
. Ho finalmente capito che il motivo per cui stavo ottenendo risultati vuoti quando si utilizzavano porzioni dell'API era perché gli oggetti Visual
che stavo cercando di stampare non erano caricati/inizializzati. Se visualizzo gli oggetti Visual
inserendoli in uno Window
di dimensioni appropriate e chiamando Show()
prima di stampare, ottengo quindi i risultati previsti.Modo appropriato per forzare il caricamento di un WPF Visual
Così, la soluzione mi è venuta è stato quello di chiamare questo metodo per ogni visiva
public static void ShowVisual(Visual visual)
{
Window window = new Window
{
Content = visual,
SizeToContent = SizeToContent.WidthAndHeight,
Visibility = Visibility.Hidden
};
window.Show();
window.Close();
}
Questo mi sembra un hack, tanto più che l'utente vede brevemente il sorteggio finestra-frame. Immagino che ci debba essere un modo diverso in cui dovrebbe essere fatto. Tuttavia, non sto presentando altre soluzioni. Sta usando davvero una finestra nascosta cosa dovrebbe essere fatto qui?
Utilizzo di un Menu L'elemento come descritto in WPF - Get size of UIElement in Memory? non funziona. Ho guardato a Force rendering of a WPF control in memory ma non voglio davvero rendere il Visual in una bitmap che sembra essere quello a cui serve. Chiamare ApplyTemplate()
su Image
che come descritto in wpf force to build visual tree non ha aiutato.
EDIT: Questa è la soluzione che viene utilizzato al posto di ShowVisual
dall'alto
/// <remarks>
/// This method needs to be called in order for
// the element to print visibly at the correct size.
/// </remarks>
private static void ArrangeElement(UIElement element)
{
var box = new Viewbox {Child = element};
box.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
box.Arrange(new Rect(box.DesiredSize));
}
Grazie per le informazioni. Non sono riuscito a trovare una classe 'ViewPort', ma alla fine mi hai portato alla soluzione. Ho provato la risposta a [Ottieni dimensioni di UIElement in memoria] (http://stackoverflow.com/a/4890217/1072626) ma usando uno 'StackPanel' invece di' MenuItem' solo perché 'StackPanel' ha 'Viewport {Height | Width} 'membri. Ha funzionato. – vossad01
Buon dolore, mi dispiace dire "Viewbox". C'è una scrittura utile [qui sopra] (http://wpftutorial.net/ViewBox.html). Sono contento di averlo risolto. – Jammer