Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# PrintFixedDocument wpf打印质量-Windows 10/8与Windows 7_C#_Wpf_Windows_Xaml - Fatal编程技术网

C# PrintFixedDocument wpf打印质量-Windows 10/8与Windows 7

C# PrintFixedDocument wpf打印质量-Windows 10/8与Windows 7,c#,wpf,windows,xaml,C#,Wpf,Windows,Xaml,我目前正在尝试使用PrintFixedDocument打印内容容器(它只包含包含信息的数据网格)和图像的内容。它在我的机器(windows 10)上以完整的图像质量完美打印,在另一台电脑(windows 8)上,质量相同 然而,当在Windows7电脑上进行此操作时,图像质量变得非常差,最终结果非常模糊。这是一个问题,因为计算机由于各种原因无法从windows 7更新,所以我想知道是否有其他人经历过这种情况,如果有,是否有解决办法?我的GetFixedDocument方法也可能存在问题,尽管我无

我目前正在尝试使用PrintFixedDocument打印内容容器(它只包含包含信息的数据网格)和图像的内容。它在我的机器(windows 10)上以完整的图像质量完美打印,在另一台电脑(windows 8)上,质量相同

然而,当在Windows7电脑上进行此操作时,图像质量变得非常差,最终结果非常模糊。这是一个问题,因为计算机由于各种原因无法从windows 7更新,所以我想知道是否有其他人经历过这种情况,如果有,是否有解决办法?我的
GetFixedDocument
方法也可能存在问题,尽管我无法解释为什么这对win 10和win 8都有效,但对win 7无效

注意:这是从每台电脑上安装的应用程序版本运行的

也在所有3个操作系统上的多台打印机上进行了尝试

任何帮助都将不胜感激

Xaml:

C#打印帮助程序代码:

 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;
        }
public static void ShowPrintPreview(FixedDocument fixedDoc)
{
var wnd=新窗口();
var viewer=新文档查看器();
viewer.Document=fixedDoc;
wnd.Content=viewer;
wnd.ShowDialog();
}
公共静态固定文档GetFixedDocument(框架元素toPrint,PrintDialog PrintDialog)
{
var capabilities=printDialog.PrintQueue.GetPrintCapabilities(printDialog.PrintTicket);
var pageSize=新大小(printDialog.PrintableAreaWidth、printDialog.PrintableAreaHeight);
var visibleSize=新大小(capabilities.PageImageableArea.extendwidth,capabilities.PageImageableArea.extendheight);
var fixedDoc=新的FixedDocument();
//如果屏幕上没有显示toPrint visual,我们需要对其进行测量和排列
toPrint.Measure(新尺寸(双精度正精度,双精度正精度));
toPrint.Arrange(新矩形(新点(0,0),toPrint.DesiredSize));
//  
变量大小=toPrint.DesiredSize;
//为简单起见,将假定控件水平放置在页面上
双yOffset=0;
而(yOffset<尺寸高度)
{
var vb=新的可视化画笔(toPrint)
{
拉伸=拉伸。无,
AlignmentX=AlignmentX.左,
AlignmentY=AlignmentY.Top,
ViewboxUnits=BrushMappingMode.Absolute,
TileMode=TileMode.None,
Viewbox=新矩形(0,Y偏移,visibleSize.Width,visibleSize.Height)
};
var pageContent=new pageContent();
var page=new FixedPage();
((IAddChild)页面内容).AddChild(页面);
fixedDoc.Pages.Add(页面内容);
page.Width=pageSize.Width;
page.Height=pageSize.Height;
var canvas=newcanvas();
FixedPage.SetLeft(canvas,capabilities.PageImageableArea.OriginWidth);
FixedPage.SetTop(画布、功能、PageImageableArea.OriginHeight);
canvas.Width=visibleSize.Width;
canvas.Height=visibleSize.Height;
canvas.Background=vb;
page.Children.Add(画布);
yOffset+=可见大小。高度;
}
返回固定DOC;
}
还有其他人经历过这种情况,如果有,是否有解决办法

这是唯一可以直接回答的问题,是的,很多。请记住,您通常会对打印机上的图像进行实质性的重新缩放,与显示器相比,打印机是每英寸点数分辨率非常高的设备。引导Win7的机器通常以96dpi运行,后来的机器往往有更好的监视器,因此通常以更高的dpi设置运行。首先要注意的是源图像。如果它的像素大小适合Win7 PC,那么当它放大到600 dpi时,它会变得非常模糊


WPF中最不直观的缩放行为可能是缩放后图像对齐与目标像素不完全匹配时发生的情况。一个在本文中描述得很好的问题。一定要阅读,这是一本非常适合你使用VisualBrush及其模糊问题的书。这个问题在.NET4.0中通过添加属性得到了解决。你不是在使用它,你绝对应该。不要盲目地应用dup推荐的位图缩放模式,图像的类型(线条艺术与照片)非常重要。

我也遇到了类似的问题,我最终没有直接打印,而是创建了一个PDF,并为客户打开,如果他们想打印的话,他们可以很好地打印


Windows7似乎因为一些WPF打印而崩溃了

尽管我相信你可能已经检查过了,但只是为了好玩。您是否检查了win7机器上的设置,以确保它没有在草稿模式下打印或进行任何手动调整大小等操作,以及确保任何打印驱动程序都是最新的?是的,已消除所有常见的怀疑。在所有打印机和所有驱动程序上以高质量打印都是最新的。这真的很奇怪,因为我从来没有见过这样的东西。是的,我知道他们对驱动程序包和其他东西做了一些更改,试图劝说制造商停止加载一堆OEM臃肿软件,但据我所知,无论操作系统版本如何,它们都应该以相同的方式加载。NET4.6修复了WPF中布局转换的一个错误。你能试着在Windows 7机器上安装.NET 4.6吗?但这不会发生在我的Windows 8和10笔记本电脑上,而且都在运行.NET 4.5.1?好的,谢谢你的回答。为了解决这个问题,它给了我很多东西去看
    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;
        }