che cosa si vuole fare, è quello di creare un xpsDocument
fuori dal contenuto che si desidera stampare (un flowDocument
) e l'uso che XpsDocument
per visualizzare in anteprima il contenuto, ad esempio diciamo che avete il seguente Xaml, con una flowDocument
che si desidera stampare il suo contenuto:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<FlowDocumentScrollViewer>
<FlowDocument x:Name="FD">
<Paragraph>
<Image Source="http://www.wpf-tutorial.com/images/logo.png" Width="90" Height="90" Margin="0,0,30,0" />
<Run FontSize="120">WPF</Run>
</Paragraph>
<Paragraph>
WPF, which stands for
<Bold>Windows Presentation Foundation</Bold> ,
is Microsoft's latest approach to a GUI framework, used with the .NET framework.
Some advantages include:
</Paragraph>
<List>
<ListItem>
<Paragraph>
It's newer and thereby more in tune with current standards
</Paragraph>
</ListItem>
<ListItem>
<Paragraph>
Microsoft is using it for a lot of new applications, e.g. Visual Studio
</Paragraph>
</ListItem>
<ListItem>
<Paragraph>
It's more flexible, so you can do more things without having to write or buy new controls
</Paragraph>
</ListItem>
</List>
</FlowDocument>
</FlowDocumentScrollViewer>
<Button Content="Print" Grid.Row="1" Click="Button_Click"></Button>
</Grid>
il campione FlowDocument è da Wpf tutorials site
il pulsante Click gestore di eventi di stampa dovrebbe apparire come questo:
private void Button_Click(object sender, RoutedEventArgs e)
{
if (File.Exists("printPreview.xps"))
{
File.Delete("printPreview.xps");
}
var xpsDocument = new XpsDocument("printPreview.xps", FileAccess.ReadWrite);
XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(xpsDocument);
writer.Write(((IDocumentPaginatorSource)FD).DocumentPaginator);
Document = xpsDocument.GetFixedDocumentSequence();
xpsDocument.Close();
var windows = new PrintWindow(Document);
windows.ShowDialog();
}
public FixedDocumentSequence Document { get; set; }
ecco siete principalmente:
- Cre a un documento Xps e memorizzarlo in printPreview.file XPS,
- scrivere il contenuto
FlowDocument
in quel file,
- passando il
XpsDocument
alla PrintWindow
in cui si gestire l'azioni anteprima di stampa e,
qui come il PrintWindow
assomiglia:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="1.5*"/>
</Grid.ColumnDefinitions>
<StackPanel>
<Button Content="Print" Click="Button_Click"></Button>
<!--Other print operations-->
</StackPanel>
<DocumentViewer Grid.Column="1" x:Name="PreviewD">
</DocumentViewer>
</Grid>
e il codice sottostante:
public partial class PrintWindow : Window
{
private FixedDocumentSequence _document;
public PrintWindow(FixedDocumentSequence document)
{
_document = document;
InitializeComponent();
PreviewD.Document =document;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
//print directly from the Xps file
}
}
il risultato finale simile a questa

Ps: per utilizzare XpsDocument si dovrebbe aggiungere un riferimento a System.Windows.Xps.Packaging namespace
dai uno sguardo anche a http://stackoverflow.com/questions/2322064/how-can-i-produce-a -print-preview-of-a-flowdocument-in-a-wpf-application – Usama
Quindi non c'è modo di farlo con una finestra di dialogo di stampa standardizzata? –
Questo è buono, probabilmente meglio usare uno stream di memoria piuttosto che un file per il rendering XPS ... (rimuove la dipendenza dal file system) – CJBS