2013-04-25 13 views
11

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)); 
} 

risposta

4

Gli elementi che si desidera stampare devono essere aggiunti alla struttura ad albero visuale in WPF in modo che il Misurare e organizzare i processi da chiamare su tutti gli elementi nell'albero visivo che si desidera mostrare/stampare o visualizzare in altro modo.

Non l'ho fatto da un po 'di tempo ma si può scoprire che aggiungere questi elementi a un ViewPort in background e quindi stamparli risolve il problema. Questo dovrebbe aggirare la necessità di visualizzarli sullo schermo e quindi l'utente vederli mentre costringe anche i processi Measure/Arrange.

+0

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

+0

Buon dolore, mi dispiace dire "Viewbox". C'è una scrittura utile [qui sopra] (http://wpftutorial.net/ViewBox.html). Sono contento di averlo risolto. – Jammer

3

Ho avuto lo stesso problema. Nel mio caso chiamo solo: Visual.UpdateLayout() prima di provare a lavorare con esso. Come detto da Jammer, forza automaticamente i processi Measure/Arrange.

L'ho fatto sulla finestra. Se hai qualche problema, probabilmente dovresti impostare l'altezza e la larghezza visive prima di chiamare UpdateLayout().

Eric

0

Ho avuto lo stesso problema. Risolto da ApplyTemplate().

Costringe a costruire un albero visivo di un elemento Framework.

Problemi correlati