• 稳扎稳打Silverlight(48) 4.0其它之打印, 动态绑定, 增强的导航系统, 杂七杂八


    [索引页]
    [源码下载]


    稳扎稳打Silverlight(48) - 4.0其它之打印, 动态绑定, 增强的导航系统, 杂七杂八



    作者:webabcd


    介绍
    Silverlight 4.0 其它:

    • 打印 - Silverlight 4.0 中新增的对打印的支持  
    • 动态绑定 - 新增的 C# 4.0 的特性及其应用
    • 增强的导航系统 
    • 杂七杂八



    在线DEMO
    http://www.cnblogs.com/webabcd/archive/2010/08/09/1795417.html


    示例
    1、演示在 Silverlight 4.0 中如何做打印操作,以及如何打印多页
    Print.xaml

    代码
    <navigation:Page x:Class="Silverlight40.Other.Print" 
               xmlns
    ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
               xmlns:x
    ="http://schemas.microsoft.com/winfx/2006/xaml" 
               xmlns:d
    ="http://schemas.microsoft.com/expression/blend/2008"
               xmlns:mc
    ="http://schemas.openxmlformats.org/markup-compatibility/2006"
               xmlns:navigation
    ="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
               Title
    ="Print Page">
        
    <Grid x:Name="LayoutRoot">
            
    <StackPanel HorizontalAlignment="Left">

                
    <TextBlock Name="lblMsg" />

                
    <Button Name="btnPrint" Content="打印图片" Click="btnPrint_Click" />

                
    <Canvas Name="canvas">
                    
    <Image Name="image" Width="300" Height="4000" Source="/Resource/Logo.jpg" Stretch="Fill" />
                
    </Canvas>

            
    </StackPanel>
        
    </Grid>
    </navigation:Page>


    Print.xaml.cs

    代码
    /*
     * 演示 Silverlight 4.0 中新增的对打印的支持 
     * PrintDocument - 用于提供打印功能的类
     *     PrintDocument.PrintedPageCount - 已经被打印的页数
     *     PrintDocument.Print(string documentName) - 弹出打印对话框。需要指定的参数为“在打印队列中需要显示的文档名称”
     *     PrintDocument.BeginPrint - 调用 Print() 方法并且按了打印对话框中的打印按钮之后所触发的事件,在 PrintPage 事件之前发生
     *     PrintDocument.EndPrint - 打印结束(包括打印被取消)后所触发的事件
     *     PrintDocument.PrintPage - 每打印一页之前所触发的事件
     * PrintPageEventArgs - PrintPage 事件的事件参数
     *     PrintPageEventArgs.PageVisual - 需要被打印的 UIElement
     *     PrintPageEventArgs.PrintableArea - 可打印的区域大小(Size 类型,其包括 Width 属性和 Height 属性和 IsEmpty 属性)
     *     PrintPageEventArgs.PageMargins - 获取当前打印页的页边距(Thickness 类型,其包括 Left 属性和 Top 属性和 Right 属性和 Bottom 属性)
     *     PrintPageEventArgs.HasMorePages - 设置是否还有更多页需要打印(如果设置为 true,则会继续出触发 PrintPage 事件)
     
    */

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;
    using System.Windows.Navigation;

    using System.Windows.Printing;

    namespace Silverlight40.Other
    {
        
    public partial class Print : Page
        {
            PrintDocument _printDocument;
            
    double _offsetY = 0d;
            
    double _totalHeight = 0d;

            
    public Print()
            {
                InitializeComponent();
            }

            
    private void btnPrint_Click(object sender, RoutedEventArgs e)
            {
                _totalHeight 
    = image.ActualHeight;

                _printDocument.Print(
    "打印队列中显示的文档名称");
            }

            
    protected override void OnNavigatedTo(NavigationEventArgs e)
            {
                _printDocument 
    = new PrintDocument();
                _printDocument.PrintPage 
    += new EventHandler<PrintPageEventArgs>(_printDocument_PrintPage);
                _printDocument.BeginPrint 
    += new EventHandler<BeginPrintEventArgs>(_printDocument_BeginPrint);
                _printDocument.EndPrint 
    += new EventHandler<EndPrintEventArgs>(_printDocument_EndPrint);
            }

            
    void _printDocument_PrintPage(object sender, PrintPageEventArgs e)
            {
                e.PageVisual 
    = canvas;

                
    // 如果需要打印的 UIElement 超过了 PrintableArea,则超过的部分在打印的时候都会被剪裁。所以如果需要打印多页的话,必须对被打印的 UIElement 所显示的内容做手工调整,使当前需要被打印的内容出现在 PrintableArea 中
                Canvas.SetTop(image, -_offsetY); 
                _offsetY 
    += e.PrintableArea.Height; 
                e.HasMorePages 
    = _offsetY <= _totalHeight;

                lblMsg.Text 
    += "正在打印:第" + (_printDocument.PrintedPageCount + 1).ToString() + "页\n";
                lblMsg.Text 
    += string.Format("当前打印的页边距:左{0},上{1},右{2},下{3}\n", e.PageMargins.Left, e.PageMargins.Top, e.PageMargins.Right, e.PageMargins.Bottom);
                lblMsg.Text 
    += "可打印区域的宽和高:" + e.PrintableArea.Width.ToString() + "×" + e.PrintableArea.Height.ToString() + "\n";
            }

            
    void _printDocument_BeginPrint(object sender, BeginPrintEventArgs e)
            {
                lblMsg.Text 
    += "开始打印\n";
            }

            
    void _printDocument_EndPrint(object sender, EndPrintEventArgs e)
            {
                Canvas.SetTop(image, 
    0);

                
    // EndPrintEventArgs.Error - 如果在打印过程中发生异常,则返回该异常
                if (e.Error == null)
                    lblMsg.Text 
    += "打印结束\n";
                
    else
                    lblMsg.Text 
    += "打印出错:" + e.Error.ToString() + "\n";
            }

        }
    }



    2、演示动态绑定的应用
    DynamicBinding.xaml.cs

    代码
    /*
     * 演示如何通过类型为 dynamic 的对象动态绑定到 HTML DOM 元素以及如何通过动态绑定调用 JavaScript
     * 使用 dynamic 之前,要先引用 Microsoft.CSharp.dll 程序集
     * 
     * 在 Silverlight40TestPage.html 页上运行程序,以查看本 Demo 的演示效果
     
    */

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;
    using System.Windows.Navigation;

    using System.Windows.Browser;

    namespace Silverlight40.Other
    {
        
    public partial class DynamicBinding : Page
        {
            
    public DynamicBinding()
            {
                InitializeComponent();
            }

            
    protected override void OnNavigatedTo(NavigationEventArgs e)
            {
                DOMDemo();

                JavaScriptDemo();
            }

            
    private void DOMDemo()
            {
                
    // 声明 HTML DOM 中的 document 为一个 dynamic 类型的对象。也就是说可以把这里的 document 对象看作是 HTML DOM Document 对象来编程
                
    // HtmlDocument继承自HtmlObject,HtmlObject继承自ScriptObject,ScriptObject 实现了 IDynamicMetaObjectProvider 接口,所以支持动态绑定
                dynamic document = HtmlPage.Document;
                
    // 获取页面上的一个名为“hello”的 div 中的内容,只需要用 HTML DOM 的编程方式即可
                string s = document.getElementById("hello").innerHTML;
                MessageBox.Show(s);
            }

            
    private void JavaScriptDemo()
            {
                
    // 获取浏览器内的 window 对象
                dynamic window = HtmlPage.Window;

                
    // 调用 JavaScript
                window.alert("Hello: webabcd");
            }
        }
    }


    相关的 DOM 部分
    Silverlight40TestPage.html

        <div style="font-size: 12px; text-align: left" id="hello">
            I am a div
        
    </div>



    3、介绍导航系统的增强
    NavigationEnhancement.xaml

    代码
    <navigation:Page x:Class="Silverlight40.Other.NavigationEnhancement" 
               xmlns
    ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
               xmlns:x
    ="http://schemas.microsoft.com/winfx/2006/xaml" 
               xmlns:d
    ="http://schemas.microsoft.com/expression/blend/2008"
               xmlns:mc
    ="http://schemas.openxmlformats.org/markup-compatibility/2006"
               xmlns:navigation
    ="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
               Title
    ="NavigationEnhancement Page">
        
    <Grid x:Name="LayoutRoot">
            
    <StackPanel HorizontalAlignment="Left">

                
    <HyperlinkButton Margin="5" NavigateUri="http://www.cnblogs.com/webabcd/archive/2009/08/10/1542663.html" TargetName="_blank" Content="Silverlight 3.0 中的导航系统的基本功能的演示" />

                
    <TextBlock Text="Frame 和 NavigationService 新增了 Refresh() 方法" Margin="5" />

                
    <TextBlock Margin="5">
                    
    <Run>Frame 的 ContentLoader 属性默认是 PageResourceContentLoader 类型的对象</Run>
                    
    <LineBreak />
                    
    <Run>如果需要自定义导系统,那么需要实现 INavigationContentLoader 接口,然后将 Frame 的 ContentLoader 属性设置为实现了该接口的类的实例即可</Run>
                
    </TextBlock>
                
            
    </StackPanel>
        
    </Grid>
    </navigation:Page>



    4、杂七杂八
    Summary.xaml.cs

    代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;
    using System.Windows.Navigation;

    namespace Silverlight40.Other
    {
        
    public partial class Summary : Page
        {
            
    public Summary()
            {
                InitializeComponent();
            }

            
    protected override void OnNavigatedTo(NavigationEventArgs e)
            {
                IsNullOrWhiteSpaceDemo();
                ConcatAndJoinDemo();
                TupleDemo();
                HasFlagDemo();
            }

            
    // String.IsNullOrWhiteSpace()  - 判断字符串是否是 null,是否是空字符串,是否是空白字符
            private void IsNullOrWhiteSpaceDemo()
            {
                lblMsg.Text 
    += string.Format("null: {0}, \"\": {1}, \" \": {2}, \"   \": {3}",
                   
    string.IsNullOrWhiteSpace(null).ToString(), // true
                   string.IsNullOrWhiteSpace("").ToString(), // true
                   string.IsNullOrWhiteSpace(" ").ToString(), // true
                   string.IsNullOrWhiteSpace("   ").ToString()); // true
                lblMsg.Text += "\n";
                
                
    // 运行结果:
                
    // null: True, "": True, " ": True, "   ": True
            }

            
    // String.Concat() 和 String.Join() - 增加了对 IEnumerable<T> 类型的支持
            private void ConcatAndJoinDemo()
            {
                List
    <int> list = new List<int>();
                
    for (int i = 0; i < 10; i++)
                {
                    list.Add(i);
                }

                lblMsg.Text 
    += string.Concat(list);
                lblMsg.Text 
    += " ";
                lblMsg.Text 
    += string.Join(",", list);
                lblMsg.Text 
    += "\n";

                
    // 运行结果:
                
    // 0123456789 0,1,2,3,4,5,6,7,8,9
            }

            
    // Tuple(元组)的 Demo
            private void TupleDemo()
            {
                var tuple 
    = Tuple.Create(1"s", DateTime.Now);
                lblMsg.Text 
    += string.Format("{0}, {1}, {2}",
                  tuple.Item1.ToString(),
                  tuple.Item2.ToString(),
                  tuple.Item3.ToString());
                lblMsg.Text 
    += "\n";

                
    // 运行结果:
                
    // 1, s, 2010/8/30 8:37:12
            }

            
    // 演示对 [Flags] 枚举的支持
            private void HasFlagDemo()
            {
                FlagsEnum e1 
    = FlagsEnum.B | FlagsEnum.D;
                FlagsEnum e2 
    = FlagsEnum.All;

                lblMsg.Text 
    += string.Format("{0}, {1}, {2}",
                   e1.HasFlag(FlagsEnum.B).ToString(),
                   e1.HasFlag(FlagsEnum.D).ToString(),
                   e2.HasFlag(FlagsEnum.F).ToString());
                lblMsg.Text 
    += "\n";

                
    // 运行结果:
                
    // True, True, True
            }
        }

        [Flags]
        
    public enum FlagsEnum
        {
            A 
    = 0,
            B 
    = 1,
            C 
    = 2,
            D 
    = 4,
            E 
    = 8,
            F 
    = 16,
            All 
    = 0 | 1 | 2 | 4 | 8 | 16
        }
    }



    OK
    [源码下载]

  • 相关阅读:
    EF实现增删改查
    托管代码与非托管代码的区别
    堆、栈以及队列
    C#装箱和拆箱
    Leecode刷题之旅-C语言/python-349两个数组的交集
    Leecode刷题之旅-C语言/python-344反转字符串
    Leecode刷题之旅-C语言/python-217存在重复元素
    Leecode刷题之旅-C语言/python-206反转链表
    Leecode刷题之旅-C语言/python-204计数质数
    Leecode刷题之旅-C语言/python-203移除链表元素
  • 原文地址:https://www.cnblogs.com/webabcd/p/1812295.html
Copyright © 2020-2023  润新知