提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
转帖|其它|编辑:郝浩|2011-08-31 14:09:53.000|阅读 536 次
概述:Silverlight 4开始提供打印的功能,这无疑使得它更加易于在企业级别的项目中使用,而不仅仅是做些演示和单独的一些文件上传之类的小的组件。
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
Silverlight 4开始提供打印的功能,这无疑使得它更加易于在企业级别的项目中使用,而不仅仅是做些演示和单独的一些文件上传之类的小的组件。
【备注】在这里,我自己的体会是,Silverlight在企业级应用中还是挺受欢迎的,如果运用得当,也确实可以有所作为。当然,我并不是说它已经很完善了,事实上,它还有不少要改进的,也许下一个版本能更好一些吧。有兴趣的朋友,可以持续关注 //www.silverlight.net/
不扯太远了,今天的问题是,如何将多页的内容压缩到一页打印?
Silverlight所提供的打印功能,很简单易用,但也不是那么方便。官方的介绍,请参考这里 //msdn.microsoft.com/zh-cn/library/ee671023(v=vs.95).aspx
一个最大的问题就是,它不知道我们提供的内容会有几页,我们必须自己去计算,然后告诉它到底有几页。网上已经有些文章,谈论多页打印的问题,例如这篇博客 , //silverlightips.net/2010/03/27/multi-page-printing-in-silverlight/
我要讨论的是另外一种情况,我知道我们的内容可能会超过一页,但是我不想打印成两页或者三页。假定我们的规则就是,即便内容超过一页,我也要压缩宽度或者高度,让它能打印在一页里面。
【备注】我讨论的是一个特定的场景,这个规则在你的公司或者项目中可能不适用。
给大家看一个例子就明白了,下图是一个最简单的Silverlight程序,彩票走势图上面有一个列表,显示了100行数据。很显然,它会超过一页,按照正常的打印,大致有三页。(A4纸)
【备注】今天全世界都在关注一个新闻,乔布斯退休了,帮主的身体也确实是不行了。这个例子里面用到了他的名字,以示尊敬
经过代码处理,我让这100行的数据,打印在了一页上面,大致看起来是这样的。
因为进行了缩放,所以在100%的比例下是看不清楚的,放大之后,可以看到最后一行确实是第100行。
你可能会说,字体有些变形了嘛,而且也看不清楚呢?是的,我知道。我们讨论的是,如何将多页内容缩放成一页,其中一个重要假设就是,你的内容适合于缩放。现在是从三页缩放到一页当然是这个样子的。但如果从一页多一点压缩到一页,则可能就不太明显了。
那么,我们是如何做到的呢?有代码有真相,有兴趣的同学可以照着做一下
页面定义
<UserControl
xmlns:toolkit="//schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit"
xmlns="//schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="//schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="//schemas.microsoft.com/expression/blend/2008"
xmlns:mc="//schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:System="clr-namespace:System;assembly=mscorlib"
x:Class="SilverlightApplication2.MainPage"
mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="400"
xmlns:c="clr-namespace:SilverlightApplication2">
<Grid
x:Name="LayoutRoot"
Background="White">
<ScrollViewer>
<StackPanel>
<ListBox
x:Name="lstData"
Padding="50"
BorderBrush="Transparent"
ItemsSource="{Binding}">
<!--定义这个转换器,可以对大小进行缩放,默认按照100%呈现-->
<ListBox.RenderTransform>
<ScaleTransform
x:Name="st"
ScaleX="1"
ScaleY="1"></ScaleTransform>
</ListBox.RenderTransform>
</ListBox>
<Button
Content="Print"
x:Name="btPrint"
Width="100"
Click="btPrint_Click"
HorizontalAlignment="Left"></Button>
</StackPanel>
</ScrollViewer>
</Grid>
</UserControl>
后台代码
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Printing;
namespace SilverlightApplication2
{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
Loaded += new RoutedEventHandler(MainPage_Loaded);
}
void MainPage_Loaded(object sender, RoutedEventArgs e)
{
//准备的一些测试数据。100行
this.DataContext = Enumerable.Range(1, 100).Select(i => new Data()
{
ID = i,
Name = "Steve Paul Jobs"
});
}
private void btPrint_Click(object sender, RoutedEventArgs e)
{
//列表的实际高度
var ah = lstData.ActualHeight;
//列表的实际宽度
var aw = lstData.ActualWidth;
//新建一个打印文档
var doc = new PrintDocument();
//处理打印事件
doc.PrintPage += (o, a) =>
{
//用户选择打印机,最后提供的打印高度
var h = a.PrintableArea.Height;
//用户选择打印机,最后提供的打印宽度
var w = a.PrintableArea.Width;
//如果宽度不够,则要压缩宽度
if(aw > w) st.ScaleX = w / aw;
//如果高度不够,则要压缩高度
if(ah > h) st.ScaleY = h / ah;
//设置打印内容
a.PageVisual = lstData;
};
//处理打印后事件
doc.EndPrint += (o, a) =>
{
//将列表重新缩放到100%
st.ScaleX = 1;
st.ScaleY = 1;
};
//开始打印
doc.Print(null);
}
}
class Data
{
public int ID { get; set; }
public string Name { get; set; }
public override string ToString()
{
return string.Format("ID={0:000},Name={1}", ID, Name);
}
}
}
这个例子实现的关键就在于,Silverlight和WPF都支持在呈现时通过不同的转换器进行转换。ScaleTransform是其中一种最简单的,可以按照比例缩放。还有可以旋转的,可以变形的等等。这些特性也是Silverlight动画设计中的核心,今天就不展开了。
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn
文章转载自:博客园面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@pclwef.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢