В настоящее время я пытаюсь распечатать содержимое контейнера содержимого (он содержит только данные с информацией) и изображение с помощью PrintFixedDocument. Он безупречно печатает на моей машине (окна 10) с полным качеством изображения и на другом ПК, который является окном 8, качество одного и того же.
Однако, когда это делается на ПК с Windows 7, качество изображения становится очень низким, и конечный результат очень размыт. Это проблема, поскольку компьютер не может быть обновлен из Windows 7 по разным причинам, поэтому им интересно, если кто-то еще испытал это, и если это так, то обходной путь? Также может быть проблема с моим методом GetFixedDocument
, хотя я не могу понять, почему это будет работать как на выигрыше 10, так и на 8, но не на 7.
ПРИМЕЧАНИЕ. ЭТО РАБОТАЕТ ИЗ УСТАНОВЛЕННОЙ ВЕРСИИ ПРИМЕНЕНИЯ НА КАЖДОМ ПК.
ТАКЖЕ ИСКЛЮЧАЕТСЯ НА МНОЖЕСТВЕННЫХ ПРИНТЕРАХ НА ВСЕХ 3 ОПЕРАЦИОННЫХ СИСТЕМАХ
Любая помощь будет оценена
Xaml:
<StackPanel Margin="-105,146,66,0" Height="900" VerticalAlignment="Top" x:Name="PrintImageContextMenu">
<Image Canvas.ZIndex="0" Source="{Binding Coupon.OverlayImagePath}" Margin="0,-21,-76,108" Stretch="Fill" />
<ContentControl Content="{Binding}" ContentTemplateSelector="{StaticResource DataViewerDataTemplateSelector}" />
</StackPanel>
С#: открытый частичный класс CouponViewerView { public CouponViewerView() { InitializeComponent(); }
public void Print()
{
//Executes On Thread
Application.Current.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, (EventHandler)delegate
{
UpdateLayout();
var fixedDoc = PrintHelper.GetFixedDocument(StackPanelToPrint, new PrintDialog());
PrintHelper.ShowPrintPreview(fixedDoc);
}, null, null);
}
private void PrintCurrentForm(object sender, RoutedEventArgs e)
{
Print();
}
С# Вспомогательный код печати:
public static void ShowPrintPreview(FixedDocument fixedDoc)
{
var wnd = new Window();
var viewer = new DocumentViewer();
viewer.Document = fixedDoc;
wnd.Content = viewer;
wnd.ShowDialog();
}
public static FixedDocument GetFixedDocument(FrameworkElement toPrint, PrintDialog printDialog)
{
var capabilities = printDialog.PrintQueue.GetPrintCapabilities(printDialog.PrintTicket);
var pageSize = new Size(printDialog.PrintableAreaWidth, printDialog.PrintableAreaHeight);
var visibleSize = new Size(capabilities.PageImageableArea.ExtentWidth, capabilities.PageImageableArea.ExtentHeight);
var fixedDoc = new FixedDocument();
//If the toPrint visual is not displayed on screen we neeed to measure and arrange it
toPrint.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
toPrint.Arrange(new Rect(new Point(0, 0), toPrint.DesiredSize));
//
var size = toPrint.DesiredSize;
//Will assume for simplicity the control fits horizontally on the page
double yOffset = 0;
while (yOffset < size.Height)
{
var vb = new VisualBrush(toPrint)
{
Stretch = Stretch.None,
AlignmentX = AlignmentX.Left,
AlignmentY = AlignmentY.Top,
ViewboxUnits = BrushMappingMode.Absolute,
TileMode = TileMode.None,
Viewbox = new Rect(0, yOffset, visibleSize.Width, visibleSize.Height)
};
var pageContent = new PageContent();
var page = new FixedPage();
((IAddChild)pageContent).AddChild(page);
fixedDoc.Pages.Add(pageContent);
page.Width = pageSize.Width;
page.Height = pageSize.Height;
var canvas = new Canvas();
FixedPage.SetLeft(canvas, capabilities.PageImageableArea.OriginWidth);
FixedPage.SetTop(canvas, capabilities.PageImageableArea.OriginHeight);
canvas.Width = visibleSize.Width;
canvas.Height = visibleSize.Height;
canvas.Background = vb;
page.Children.Add(canvas);
yOffset += visibleSize.Height;
}
return fixedDoc;
}