WPF StoreDataSetPaginator

public class StoreDataSetPaginator : DocumentPaginator
    {
        private DataTable dt;

        // Could be wrapped with public properties that call PaginateData() when set.
        private Typeface typeface;
        private double fontSize;
        private double margin;

        public StoreDataSetPaginator(DataTable dt, Typeface typeface, double fontSize, double margin, Size pageSize)
        {
            this.dt = dt;
            this.typeface = typeface;
            this.fontSize = fontSize;
            this.margin = margin;
            this.pageSize = pageSize;
            PaginateData();
        }
        public override bool IsPageCountValid
        {
            get { return true; }
        }

        private int pageCount;
        public override int PageCount
        {
            get { return pageCount; }
        }

        private Size pageSize;
        public override Size PageSize
        {
            get
            {
                return pageSize;
            }
            set
            {
                pageSize = value;
                PaginateData();
            }
        }

        public override IDocumentPaginatorSource Source
        {
            get { return null; }
        }

        // This helper method splits the data into pages.
        // In some cases you‘ll need to store objects representing the per-page data.
        // Here, a rowsPerPage value is enough becuase every page is the same.
        private int rowsPerPage;

        /// <summary>
        /// 计算页数
        /// </summary>
        private void PaginateData()
        {
            // Create a test string for the purposes of measurement.
            FormattedText text = GetFormattedText("A");

            // Count the lines that fit on a page.
            rowsPerPage = (int)((pageSize.Height - margin * 2) / text.Height);

            // Leave a row for the headings
            rowsPerPage -= 1;

            pageCount = (int)Math.Ceiling((double)dt.Rows.Count / rowsPerPage);
        }

        public override DocumentPage GetPage(int pageNumber)
        {
            // Create a test string for the purposes of measurement.
            FormattedText text = GetFormattedText("A");
            // Size columns relative to the width of one "A" letter.
            // It‘s a shortcut that works in this example.
            double col1_X = margin;
            double col2_X = col1_X + text.Width * 15;

            // Calculate the range of rows that fits on this page.
            int minRow = pageNumber * rowsPerPage;
            int maxRow = minRow + rowsPerPage;

            // Create the visual for the page.
            DrawingVisual visual = new DrawingVisual();

            // Initially, set the position to the top-left corner of the printable area.
            Point point = new Point(margin, margin);

            // Print the column values.
            using (DrawingContext dc = visual.RenderOpen())
            {
                // Draw the column headers.
                Typeface columnHeaderTypeface = new Typeface(typeface.FontFamily, FontStyles.Normal, FontWeights.Bold, FontStretches.Normal);
                point.X = col1_X;
                text = GetFormattedText("Model Number", columnHeaderTypeface);
                dc.DrawText(text, point);
                text = GetFormattedText("Model Name", columnHeaderTypeface);
                point.X = col2_X;
                dc.DrawText(text, point);

                // Draw the line underneath.
                dc.DrawLine(new Pen(Brushes.Black, 2),
                    new Point(margin, margin + text.Height),
                    new Point(pageSize.Width - margin, margin + text.Height));

                point.Y += text.Height;

                // Draw the column values.
                for (int i = minRow; i < maxRow; i++)
                {
                    // Check for the end of the last (half-filled) page.
                    if (i > (dt.Rows.Count - 1)) break;

                    point.X = col1_X;
                    text = GetFormattedText(dt.Rows[i]["ModelNumber"].ToString());
                    dc.DrawText(text, point);

                    // Add second column.
                    text = GetFormattedText(dt.Rows[i]["ModelName"].ToString());
                    point.X = col2_X;
                    dc.DrawText(text, point);
                    point.Y += text.Height;
                }
            }
            return new DocumentPage(visual, pageSize, new Rect(pageSize), new Rect(pageSize));
        }

        private FormattedText GetFormattedText(string text)
        {
            return GetFormattedText(text, typeface);
        }

        private FormattedText GetFormattedText(string text, Typeface typeface)
        {
            return new FormattedText(
                text, CultureInfo.CurrentCulture, FlowDirection.LeftToRight,
                        typeface, fontSize, Brushes.Black);
        }

    }
时间: 2024-10-11 07:06:50

WPF StoreDataSetPaginator的相关文章

WPF 依赖属性概念

理解依赖属性 在 WPF 中变成相比较于 传统 Windows Forms 变成发生了较大的改变. 属性现在以一组服务的形式提供给开发人员. 这组服务就叫做属性系统. 由 WPF 属性系统所支持的属性成为依赖属性. 依赖属性的概念 WPF 在依赖属性中提供了标准属性无法提供的功能, 特性如下: 决定属性值: 依赖属性的属性值可以在运行时有其他元素或者是其他信息所决定, 决定的过程具有一个优先次序. 自动验证或变更通知: 依赖属性哟一个自定的回调方法, 当属性值变更时被执行, 这个回调能验证新的值

wpf附加属性理解

WPF附加属性 http://www.cnblogs.com/tianyou/archive/2012/12/27/2835670.html WPF属性(二)附加属性 http://blog.csdn.net/iamsupercola/article/details/7069848 附加属性是说一个属性本来不属于某个对象,但由于某种需求而被后来附加上,也就是把对象放入一个特定环境后对象才具有的属性就称为附加属性,附加属性的作用就是将属性与数据类型解耦,让数据类型的设计更加灵活. 这个解释的比较清

WPF窗体の投影效果

有时候我们需要给WPF窗体加上一个毛边(投影效果) 我们可以在窗体下加上如下代码 <Window.Effect> <DropShadowEffect BlurRadius="24" Color="#FF858484" Direction="90" ShadowDepth="3"/> </Window.Effect> 然后需要给窗体设置一个border BorderThickness=&quo

WPF笔记整理 - Bitmap和BitmapImage

项目中有图片处理的逻辑,因此要用到Bitmap.而WPF加载的一般都是BitmapImage.这里就需要将BitmapImage转成Bitmap 1. 图片的路径要用这样的,假设图片在project下的Images目录,文件名XXImage.png. pack://application:,,,/xxx;component/Images/XXImage.png 2. 代码: Bitmap bmp = null; var image = new BitmapImage(new Uri(this.X

WPF自定义控件与样式(11)-等待/忙/正在加载状态-控件实现

一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要有三种实现方式: 简单忙碌状态控件BusyBox: Win8/win10效果忙碌状态控件ProgressRing: 弹出异步等待框WaitingBox: 二.简单忙碌状态控件BusyBox 效果图: 通过属性"IsActive"控制控件是否启用,后台C#代码: /// <summary> /

企业级架构 MVVM 模式指南 (WPF 和 Silverlight 实现) 译(2)

本书包含的章节内容 第一章:表现模式,以一个例子呈献给读者表现模式的发展历程,我们会用包括MVC和MVP在内的各种方式实现一个收费项目的例子.沿此方向,我们会发现每一种模式的问题所在,这也是触发设计模式发展的原因.本章还会说明如果应用不当,MVC和MVP这些依赖.Net事件的表现模式是怎么导致内存泄漏的.本章会谈论各种表现模式的优缺点,并且留给读者自我思考的问题,如为什么用MVVM设计模式来代替MVP或是MVC.第二章:介绍MVVM,包括使MVVM魅力四射的WPF和Silverlight的各种特

(WPF)属性值继承

属性值继承并不同于传统面向对象的类继承,而是指属性值自顶向下沿着元素树传递. 下面的代码在Window 元素上设置了Font属性.两个设置将会沿着逻辑树向下传递,并由子元素继承. 但是若子元素如设置了这样的属性,则不受其父元素设置的影响. <span style="font-size:14px;"> </span><span style="font-size:12px;"><Window xmlns = "http

C#入门分享(九)——WPF开发

WPF(Windows Presentation Foundation)是微软推出的基于Windows Vista的用户界面框架,属于.NET Framework 3.0的一部分.它提供了统一的编程模型.语言和框架,真正做到了分离界面设计人员与开发人员的工作:同时它提供了全新的多媒体交互用户图形界面.WPF可以更方便的开发更漂亮的界面,并且可以比以前更好地将GUI设计和程序逻辑分离开来,使得有条件的公司可以专门培养平面设计人员进行GUI设计(有点类似于与网页美工),而程序员更加关注业务逻辑. 下

《WPF揭秘》

书本上的东西没有理解体会就不是自己的,理解体会了没有学以致用很快又会忘到爪哇国,先把看过的书记录在这里,以后忘记了还可以来看看. 1.XAML Xaml是一种声明式的编程语言,是一种调用.Net的API的方式,在WPF应用程序中一般用它来生成界面. 在Xaml中为对象设置的事件处理程序总是在设置属性之后(Name属性除外,对象构造后立即设置). Xaml中有一种运行时根据字符串生成对象的表达方式叫做标记扩展(MarkupExtension). 由于花括号(“{”和“}”)代表标记扩展,如果向输入