c# - seleccionar - Imprimir diálogo e imprimir el diálogo de previsión para WPF
seleccionar impresora c# (2)
Lo que quiere hacer es crear un xpsDocument
del contenido que desea imprimir (un flowDocument
) y usar ese XpsDocument
para obtener una vista previa del contenido; por ejemplo, supongamos que tiene el siguiente Xaml , con un flowDocument
que desea imprimir su contenido :
<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>
la muestra de flowDocument es del sitio de tutoriales de Wpf
el controlador de evento Click del botón de impresión debería verse así:
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; }
así que aquí estás principalmente:
- Crear un documento Xps y almacenarlo en el archivo printPreview.xps,
- Escribir el contenido de
FlowDocument
en ese archivo, - pasando el
XpsDocument
aPrintWindow
en el que manejará la vista previa y las acciones de impresión,
aquí cómo se ve PrintWindow
:
<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>
y el código detrás:
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
}
}
el resultado final se ve algo como esto
Ps: para usar XpsDocument, debe agregar una referencia al espacio de nombres System.Windows.Xps.Packaging
¿Existe un diálogo de impresión para WPF que se combine con un cuadro de diálogo de vista previa de impresión en WPF como Google Chrome o Word?
En este momento utilizo un diálogo de vista previa de impresión desde formularios de Windows. También he intentado usar la versión de WPF. Pero WPF no tiene PrintPreviewDialog
o PrintPrewiewControl
. Este es mi código:
//To the top of my class file:
using Forms = System.Windows.Forms;
//in a methode on the same class:
PageSettings setting = new PageSettings();
setting.Landscape = true;
_document = new PrintDocument();
_document.PrintPage += _document_PrintPage;
_document.DefaultPageSettings = setting ;
Forms.PrintPreviewDialog printDlg = new Forms.PrintPreviewDialog();
printDlg.Document = _document;
printDlg.Height = 500;
printDlg.Width = 200;
try
{
if (printDlg.ShowDialog() == Forms.DialogResult.OK)
{
_document.Print();
}
}
catch (InvalidPrinterException)
{
MessageBox.Show("No printers found.", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
}
También busqué un paquete NuGet pero nada me pareció muy bueno.
Sus requisitos se pueden lograr de varias maneras, por ejemplo, puede usar la clase PrintDialog
. Las siguientes páginas de MSDN contienen descripciones y algunos ejemplos de código:
- WinForms: System.Windows.Forms.PrintDialog
- WPF: System.Windows.Controls.PrintDialog (gracias a Bartosz )
Alternativamente, se puede lograr a través de C #, por ejemplo, considere el siguiente código:
private string _previewWindowXaml =
@"<Window
xmlns =''http://schemas.microsoft.com/netfx/2007/xaml/presentation''
xmlns:x =''http://schemas.microsoft.com/winfx/2006/xaml''
Title =''Print Preview - @@TITLE''
Height =''200'' Width =''300''
WindowStartupLocation =''CenterOwner''>
<DocumentViewer Name=''dv1''/>
</Window>";
internal void DoPreview(string title)
{
string fileName = System.IO.Path.GetRandomFileName();
FlowDocumentScrollViewer visual = (FlowDocumentScrollViewer)(_parent.FindName("fdsv1"));
try
{
// write the XPS document
using (XpsDocument doc = new XpsDocument(fileName, FileAccess.ReadWrite))
{
XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(doc);
writer.Write(visual);
}
// Read the XPS document into a dynamically generated
// preview Window
using (XpsDocument doc = new XpsDocument(fileName, FileAccess.Read))
{
FixedDocumentSequence fds = doc.GetFixedDocumentSequence();
string s = _previewWindowXaml;
s = s.Replace("@@TITLE", title.Replace("''", "'"));
using (var reader = new System.Xml.XmlTextReader(new StringReader(s)))
{
Window preview = System.Windows.Markup.XamlReader.Load(reader) as Window;
DocumentViewer dv1 = LogicalTreeHelper.FindLogicalNode(preview, "dv1") as DocumentViewer;
dv1.Document = fds as IDocumentPaginatorSource;
preview.ShowDialog();
}
}
}
finally
{
if (File.Exists(fileName))
{
try
{
File.Delete(fileName);
}
catch
{
}
}
}
}
Lo que hace: en realidad, imprime el contenido de una imagen visual en un documento XPS. A continuación, carga el documento XPS "impreso" y lo muestra en un archivo XAML muy simple que se almacena como una cadena, en lugar de como un módulo separado, y se carga dinámicamente en el tiempo de ejecución. La ventana resultante tiene los botones de DocumentViewer: imprimir, ajustar al máximo de la página, etc.
También agregué un código para ocultar el cuadro de búsqueda. Vea esta respuesta a WPF: ¿Cómo puedo eliminar el cuadro de búsqueda en un DocumentViewer? por cómo lo hice
El efecto es así:
texto alternativo http://i48.tinypic.com/2hzkfat.jpg
El XpsDocument se puede encontrar en el dll ReachFramework y el XpsDocumentWriter se puede encontrar en System.Printing dll, los cuales se deben agregar como referencias al proyecto