因为 要实现打印 wpf  listbox控件  数据特别多 要打印在 几张纸上    找了几天 都没有找到相关的例子

现在 解决了 在这里和大家分享一下

public void print(FrameworkElement ViewContainer)

{

FrameworkElement objectToPrint = ViewContainer as FrameworkElement;

PrintDialog printDialog = new PrintDialog();

printDialog.PrintTicket.PageOrientation = PageOrientation.Landscape;

if ((bool)printDialog.ShowDialog().GetValueOrDefault())

{

Mouse.OverrideCursor = Cursors.Wait;

PrintCapabilities capabilities =

printDialog.PrintQueue.GetPrintCapabilities(printDialog.PrintTicket);

double dpiScale = 300.0 / 96.0;

FixedDocument document = new FixedDocument();

try                 {

objectToPrint.Width = capabilities.PageImageableArea.ExtentWidth;

objectToPrint.UpdateLayout();

objectToPrint.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));

Size size = new Size(capabilities.PageImageableArea.ExtentWidth,

objectToPrint.DesiredSize.Height);

objectToPrint.Measure(size);

size = new Size(capabilities.PageImageableArea.ExtentWidth,

objectToPrint.DesiredSize.Height);

objectToPrint.Measure(size);

objectToPrint.Arrange(new Rect(size));

// Convert the UI control into a bitmap at 300 dpi

double dpiX = 300;

double dpiY = 300;

RenderTargetBitmap bmp = new RenderTargetBitmap(Convert.ToInt32(

capabilities.PageImageableArea.ExtentWidth * dpiScale),

Convert.ToInt32(objectToPrint.ActualHeight * dpiScale),

dpiX, dpiY, PixelFormats.Pbgra32);

bmp.Render(objectToPrint);

// Convert the RenderTargetBitmap into a bitmap we can more readily use

PngBitmapEncoder png = new PngBitmapEncoder();

png.Frames.Add(BitmapFrame.Create(bmp));

System.Drawing.Bitmap bmp2;

using (MemoryStream memoryStream = new MemoryStream())

{

png.Save(memoryStream);

bmp2 = new System.Drawing.Bitmap(memoryStream);

}

document.DocumentPaginator.PageSize =

new Size(printDialog.PrintableAreaWidth, printDialog.PrintableAreaHeight);

// break the bitmap down into pages

int pageBreak = 0;

int previousPageBreak = 0;

int pageHeight =

Convert.ToInt32(capabilities.PageImageableArea.ExtentHeight * dpiScale);

while (pageBreak < bmp2.Height - pageHeight)

{

pageBreak += pageHeight;  // Where we thing the end of the page should be

// Keep moving up a row until we find a good place to break the page

while (!IsRowGoodBreakingPoint(bmp2, pageBreak))                             pageBreak--;

PageContent pageContent = generatePageContent(bmp2, previousPageBreak,

pageBreak, document.DocumentPaginator.PageSize.Width,

document.DocumentPaginator.PageSize.Height, capabilities);                         document.Pages.Add(pageContent);                         previousPageBreak = pageBreak;                     }

// Last Page

PageContent lastPageContent = generatePageContent(bmp2, previousPageBreak,

bmp2.Height, document.DocumentPaginator.PageSize.Width,

document.DocumentPaginator.PageSize.Height, capabilities);

document.Pages.Add(lastPageContent);

}

finally

{

// Scale UI control back to the original so we don't effect what is on the screen

objectToPrint.Width = double.NaN;

objectToPrint.UpdateLayout();

objectToPrint.LayoutTransform = new ScaleTransform(1, 1);

Size size = new Size(capabilities.PageImageableArea.ExtentWidth,

capabilities.PageImageableArea.ExtentHeight);

objectToPrint.Measure(size);

objectToPrint.Arrange(new Rect(new Point(capabilities.PageImageableArea.OriginWidth,

capabilities.PageImageableArea.OriginHeight), size));

Mouse.OverrideCursor = null;

}

printDialog.PrintDocument(document.DocumentPaginator, "Print Document Name");

}         }

private PageContent generatePageContent(System.Drawing.Bitmap bmp, int top,          int bottom, double pageWidth, double PageHeight,          System.Printing.PrintCapabilities capabilities)         {

FixedPage printDocumentPage = new FixedPage();

printDocumentPage.Width = pageWidth;

printDocumentPage.Height = PageHeight;

int newImageHeight = bottom - top;

System.Drawing.Bitmap bmpPage = bmp.Clone(new System.Drawing.Rectangle(0, top,                    bmp.Width, newImageHeight), System.Drawing.Imaging.PixelFormat.Format32bppArgb);

// Create a new bitmap for the contents of this page

Image pageImage = new Image();

BitmapSource bmpSource =

System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(

bmpPage.GetHbitmap(),

IntPtr.Zero,

System.Windows.Int32Rect.Empty,

BitmapSizeOptions.FromWidthAndHeight(bmp.Width, newImageHeight));

pageImage.Source = bmpSource;

pageImage.VerticalAlignment = VerticalAlignment.Top;

// Place the bitmap on the page

printDocumentPage.Children.Add(pageImage);

PageContent pageContent = new PageContent();

((System.Windows.Markup.IAddChild)pageContent).AddChild(printDocumentPage);

FixedPage.SetLeft(pageImage, capabilities.PageImageableArea.OriginWidth);

FixedPage.SetTop(pageImage, capabilities.PageImageableArea.OriginHeight);

pageImage.Width = capabilities.PageImageableArea.ExtentWidth;

pageImage.Height = capabilities.PageImageableArea.ExtentHeight;

return pageContent;         }

private bool IsRowGoodBreakingPoint(System.Drawing.Bitmap bmp, int row)         {

double maxDeviationForEmptyLine = 1627500;

bool goodBreakingPoint = false;

if (rowPixelDeviation(bmp, row) < maxDeviationForEmptyLine)

goodBreakingPoint = true;

return goodBreakingPoint;

}         private double rowPixelDeviation(System.Drawing.Bitmap bmp, int row)

{

int count = 0;

double total = 0;

double totalVariance = 0;

double standardDeviation = 0;

System.Drawing.Imaging.BitmapData bmpData = bmp.LockBits(new System.Drawing.Rectangle(0, 0,

bmp.Width, bmp.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp.PixelFormat);

int stride = bmpData.Stride;

IntPtr firstPixelInImage = bmpData.Scan0;

unsafe

{

byte* p = (byte*)(void*)firstPixelInImage;

p += stride * row;  // find starting pixel of the specified row

for (int column = 0; column < bmp.Width; column++)

{

count++;  //count the pixels

byte blue = p[0];

byte green = p[1];

byte red = p[3];

int pixelValue = System.Drawing.Color.FromArgb(0, red, green, blue).ToArgb();

total += pixelValue;

double average = total / count;

totalVariance += Math.Pow(pixelValue - average, 2);

standardDeviation = Math.Sqrt(totalVariance / count);

//go to next pixel

p += 3;

}

}

bmp.UnlockBits(bmpData);

return standardDeviation;

}

wpf打印控件 实现分页打印控件功能的更多相关文章

  1. 使用ScriptX控件实现IE浏览器分页打印功能

    之前讲过js调用ie浏览器自带打印的用法,今天讲使用插件的方式.浏览器自带打印不能控制页边距.页眉页脚等选项,尤其是如果分页打印的话,无法自动将前一页标题带到本页,所以不适用多页打印的功能.使用Scr ...

  2. lodop 控件实现web打印功能

    WEB套打可选方案不多,理想的更少,利用免费控件Lodop+JavaScript实现精确套打,算是较为经典的选择.这种方案其实比较简单,利用一个htm文件就可以实现模板设计过程,几乎是“空手套”式的开 ...

  3. c# asp.net 鼠标改变控件坐标位置,更改控件坐标,注册表保存读取,打印,查找局域网内打印机等等收集

    界面虽然被我弄的很难看,但功能还可以 里边注册表的路径自己设置一下,或者加一个创建注册表的语句,不然会报错 前台: <%@ Page Language="C#" AutoEv ...

  4. WPF MVVM 用户控件完成分页

    项目中经常会有分页查询的情况,在WPF中我们可以通过用户控件完成分页 一下为分页控件的页面代码, <UserControl x:Class="Foundation.UCtrl.Next ...

  5. 关于使用smsx.cab控件做web打印使用方法(转)

    注意:在使用之前先告诉下我的痛苦经历 在做WEB项目是我的JSP页面在jsp文件夹里,我把smsx.cab放在js文件夹里(jsp和js是用级别目录) 在本机上测试可以正确下载控件,但是部署到测试服务 ...

  6. 基于WPF系统框架设计(10)-分页控件设计

    背景 最近要求项目组成员开发一个通用的分页组件,要求是这个组件简单易用,通用性,兼容现有框架MVVM模式,可是最后给我提交的成果勉强能够用,却欠少灵活性和框架兼容性. 设计的基本思想 传入数据源,总页 ...

  7. WPF知识点全攻略05- XAML内容控件

    此处简单列举出布局控件外,其他常用的控件: Window:WPF窗口 UserControl:用户控件 Page:页 Frame:用来浏览Page页 Border:嵌套控件,提供边框和背景. Butt ...

  8. WPF基础知识、界面布局及控件Binding(转)

    WPF是和WinForm对应的,而其核心是数据驱动事件,在开发中显示的是UI界面和逻辑关系相分离的一种开放语言.UI界面是在XAML语言环境下开发人员可以进行一些自主设计的前台界面,逻辑关系还是基于c ...

  9. 036. asp.netWeb用户控件之五使用用户控件实现分页数据导航

    UserDataPager.ascx用户控件代码: <%@ Control Language="C#" AutoEventWireup="true" Co ...

随机推荐

  1. HDU2686-Matrix & HDU3376-Matrix Again(费用流)

    比较简单的题了. 只需从左上角到右下角找两条路就可以了. 因为每个点只能走一次,所以拆点,限制流量为1. 因为求的是最大值,所以权值取反求最小值. 因为第一个点和最后一个点经过两次,只算一次,最后要减 ...

  2. Android 解析 xml

    URL httpUrl = new URL(url); HttpURLConnection conn = (HttpURLConnection )httpUrl.openConnection(); c ...

  3. [一]初识Json

    JSON 对象{ "name":"张三" , "age":22}JSON 数组{"student": [{ " ...

  4. 关系数据库 范式(NF: Normal Form) 说明

    关系数据库 范式(NF: Normal Form) 说明 数据库电话insertdelete存储oracle   目录(?)[+]   一.范式概述(NF:NormalForm) 数据库的设计范式是数 ...

  5. 解决 mac ssh空闲 连接断开问题

    想必大家都知道,用终端 ssh 连接服务器,如果长时间没有操作,会被断开连接. 要用的话又得重新登录,这非常不方便,也影响开发效率.那针对这种情况,有没有解决方法呢? 答案是肯定的.理论上,有两种方案 ...

  6. NUMBER_GET_NEXT

    1. SNRO /SNUM创建一个流水号对象 CALL FUNCTION 'NUMBER_RANGE_ENQUEUE' EXPORTING OBJECT = '' EXCEPTIONS FOREIGN ...

  7. Android开发之有效获取状态栏(StatusBar)高度

    获取状态栏高度 一.传统方式:有时获取为0,解决方法看  二 1 2 3 4 代码 Rect frame = new Rect(); getWindow().getDecorView().getWin ...

  8. linux和windows文件名称长度限制

    Linux文件名称的长度限制是255个字符 windows下全然限定文件名称必须少于260个字符,文件夹名必须小于248个字符. linux下文件数.文件夹数.文件名称长度的各种限制 下面測试都是在没 ...

  9. C#-设置窗体在显示器居中显示

    在窗体的属性中查看:StartPosition属性,该属性的设置中有一个"CenterScreen"的选择项,该项就是设置窗体局中显示的.

  10. C++容器类对象函数參数问题

    总之中的一个句话:容器类对象作为函数參数,与整数类型作为函数參数的传递特性同样. 验证程序 #include "stdafx.h" #include <iostream> ...