采用WPF技术,开发OFD电子文档阅读器

前言 OFD是国家标准版式文档格式,于2016年生效。OFD文档国家标准参见《电子文件存储与交换格式版式文档》。既然是国家标准,OFD随后肯定会首先在政务系统使用,并逐步推向社会各个方面。OFD是在研究当下各类文件格式后,推出的标准,有如下优点:1产权属于自主产权2具有便携性:文件小,可压缩比率大。测试显示生成的文件体量比PDF还要小。3具有开放性:易于入门,对于使用者来说更具开放性。4具有扩展性:预留了可扩展入口和自定义标引,设置了非接触式引用机制,为特性化提供支持。5呈现效果与设备无关,在各种设备上阅读、打印或印刷时,版面固定、不跑版。6应用广泛:无论是电子商务、电子公务,还是信息发布、文件交换,档案管理等都需要版式文档的技术支持。  关于标准,我也要吐槽一下。OFD标准是国内几家专业的电子文档处理公司参与起草的;标准文档(注:以下用”标准”特指OFD标准)只有126页,在我看来,标准对技术细节的描述过于简单,没有一定的技术背景很难看懂。与此形成鲜明对比的是pdf标准,有1000多页。我在网上也没找到文字版的标准,特别不利于阅读和参考。ofd阅读器程序(已集成了转图、转P...

pdf文件内容查看器 -- 采用wpf开发

前言pdf是一种应用非常广的版式文档格式,已成为事实上的国际标准。关于pdf格式的文章汗牛充栋,本文也是关于pdf格式的文章,但是本文不是纸上谈兵;本人这几周一直研究pdf格式内容,不但对pfd格式的内容有所了解,同时也写了一款软件,可以方便查看pdf文件内容。使用该软件,同时结合pdf相关文章,可以很快掌握pdf格式内容。软件截图:软件下载地址点我下载pdf文件内容简要介绍这里对pdf文件格式做个粗略介绍,只有了解了这些内容,才能知道如何使用该软件。pdf文档总结构如下:1)header:主要包含版本信息2)tailer:pdf树结构的入口点。 3)交叉索引表;该表包含pdf每个obj在文件中的位置,根据该表,可以快速定位和加载obj的内容。对于大文件,不必一次加载所有的内容,只需加载当前页包含的obj即可。 4)body。包含obj对应的内容。pdfobj树状结构要完成对pdf文件的分析和显示,首先需要构建pdf文件的obj的树状模型。这个树状模型的入口点就是trailer,trailer包含root元素(Catalog),其下包含Pages,Page。Page...

彩票历史记录分析工具 -- 通过实例学习wpf开发

前言 虽然本人对彩票不感兴趣,仍然有不少人对此情有独钟。他们花大量时间精力去分析彩票的历史记录,企图发现规律,为下一次投注做指导,希望“赢的“”概率增大。不管研究历史记录是否有意义,我用软件实现了对彩票的分析,手工分析彩票几天工作量,现在一秒可以实现。执行程序,点我下载!程序界面  处理原理分析:程序实际上是对六合彩分析(彩票种类很多,本文只处理一种)。数据格式如下:2010001111322162118201000222281651426201000351445481625每期6个号,任选3个号,如果6个号中包含该3个号,该期算中奖了。彩票数值范围为1--49,每期都是6选3.每次投注3个号,所有的投注可能性有18424次,从概率上讲,每次投注中奖的可能性是18424分之1.软件就是分析选哪三个号中奖概率最大。是根据历史记录统计分析,找出历史记录上哪些号码出现次数多。 彩票历史记录界面  这是ListView控件,显示彩票历史记录。如何显示这样的界面?这种类型的界面非常适用MVVM模式展示。你准备数据和显示模板,剩下的事由L...

采用WPF技术开发截图程序 (可下载)

前言 QQ、微信截图功能已很强大了,似乎没必要在开发一个截图程序了。但是有时QQ热键就是被占用,不能快速的开启截屏;有时,天天挂着QQ,领导也不乐意。既然是程序员,就要自己开发截屏工具,功能随心所欲,岂不快哉。再强调一点:工具就是生产力!没有掌握WPF之前,我是不会开发这么一个程序的,如果采用MFC、winform框架,工作量是相当的大,开发出来的效果肯定也比较low。本人用WPF,花了一天多的功夫,开发了这个小程序。程序的定位就功能简单,平时工作不碍事,用着的时候,一键截图! 界面 执行程序下载地址:一键截图,点我下载。  获取最新版本和其他相关工具,可加入QQ群:920519255;为了不影响视觉, 程序主界面非常小。程序会在所有界面最前端展示。有两个按钮1)“快捷截图”:截图后,立即将截图复制到剪切板。2)“截图+编辑”:截图后,可以在图上标注箭头和文字。程序展开时,效果:截图后,可编辑:新增保留历史记录功能,选中历史记录,复制到剪切板。截图类型:静态:截取按下按钮那一刻的屏幕图片,图片是静止的(比如截取视频,视频内容是...

GMap.NET实现电子围栏功能(WPF版)

 前言  GMap.NET是一个强大、免费、跨平台、开源的.NET控件。分为WPF和winform版。GMap.NET的基本知识不做过多介绍,本文主要介绍如何使用该控件实现电子围栏功能。电子围栏主要有两个功能模块:界面展示围栏区域,判断人员出入围栏的逻辑。GMap.NET的WPF版本功能并不强大,实现一些复杂的功能就只能发掘WPF的潜力了。GMap.NET给我们提供了一个基本的平台,必须熟练掌握WPF才能开发出复杂gis产品。围栏区域界面显示1认识GMapMarker  GMapControl是地图的主容器;地图就是多个图片拼接而来,这个图片组成GMapControl的底图。底图之上点缀用户自定义的控件。用户自定义控件必须通过GMapMarker间接添加进来,看下面代码:GMapMarkermaker=newGMapMarker(ptLatLng);//UserControlFence用户自定控件_ctrlCurrentFence=newUserControlFence(){Marker=maker,MapCtrl=MainMap};_ctrlCurren...

十余年软件开发经历,经验总结和程序一览(涉及Socket、WPF、vc++、CAD、图像、GIS)

前言本文主要介绍我开发的几款软件产品,大概介绍一下功能。可以让读者了解本人的开发能力,所擅长的方面。有相关开发需求可以联系作者。本人开发软件多年,从事的行业也多种多样;自然接触了不同的业务,开发了各类软件产品。工作的主线一直是windows下C/S模式软件开发;最近也开始学习asp.netcore。  软件开发和读书一样,先由厚到薄,再有薄到厚。纯粹的软件理论总是很空洞,让人无法适从。如果没有一定的理论做指导,就像在茫茫大海中航行,很容易迷失方向。理论和实践要不断的互动,相互验证,不断的领悟。通过多年的软件开发,不断的学习总结,本人在理论和实践上都有很大的突破,开发各类软件更加得心应手。   软件开发需要多种技能,每个人都不可能成为全才,好像也没必要。比较现实的还是“一专多能”。要有自己的优势,同时知识面也不要太窄。国内软件开发大部分是“游击战”,主力软件开发人员很少,开发过程没有固定的章法。软件的成败很大程度上依赖软件开发人员个人能力,个人英雄主义的色彩比较浓。这种开发模式也是有好处的,在某种程度上能减少开发成本。小的软件产品多人开发,并不能提高效率;如果开发人员能力差别大...

使用GMap.NET类库,实现地图轨迹回放。(WPF版)

前言实现轨迹回放,GMap.NET有对应的类GMapRoute。这个类函数很少,功能有限,只能实现简单的轨迹回放。要实现更复杂的轨迹回放,就需要自己动手了。本文介绍一种方法,可以实现复杂的轨迹回放。有句话“功夫在诗外”,GMap.NET给你提供了基本地图处理功能;但是不要让CMap.NET束缚了手脚。你需要有深刻理解地图实现原理,深入理解WPF动画的原理,才能到达随心所欲。最终的效果如下:GMap.NET显示原理地图就是由许多方格“瓦片”组合而来。当你移动或缩放时,GMap.NET会根据当前位置、显示窗口、缩放级别,到地图服务器获取图片。所以地图控件本质上就是显示图片的控件,只是这些图片包含了坐标信息。地图上加轨迹,就是在图片上画线。这些线要与gps坐标点吻合。通过GMapMarker不仅可以加标注,也可以实现轨迹。需要将gps坐标点转换成控件的坐标点,再连成线就可以了。本文就是通过GMapMarker实现了轨迹回放。 1 实现轨迹显示 通过自定义控件UserControlMapRoute实现了轨迹显示功能。需要将此控件加入到GMapMarker。GMap...

使用 GMap.NET 实现添加标注、移动标注功能。(WPF版)

前言在WPF嵌入地图,有两种方式:浏览器方式;控件方式。1)浏览器方式就是使用浏览器控件WebBrowser,设置好网址就行了。这种方式与地图的交互不太直接,需要懂html、javascript。对于不懂web编程的开发者来说,有点困难。2)控件方式就是使用第三方控件;不需要处了解web相关知识,使用起来比较直接,易于理解。GMap.net类库实现了这种控件。GMap.net简介GMap.NET是一个强大、免费、跨平台、开源的.NET控件,它在WindowsForms和WPF环境中能够通过Google,Yahoo!,Bing,OpenStreetMap,ArcGIS,Pergo,SigPac等实现寻找路径、地理编码以及地图展示功能,并支持缓存和运行在Mobile环境中。GMap.NET多年前已经存在,最初主要支持WinForm。WPF出现的较晚;但是,现在这个控件也可用于WPF开发。不过,网上相关WPF开发的例子较少。因为工作需要,最近使用这个控件开发了gis相关项目,把开发过程中的使用技巧写出来,以供参考!其中部分代码参考了别人的文章,稍作修改!程序界面:将GMap.net加入项目...

图片按日期分类和查看程序(WPF开发)(附源码)

  手机方便了我们的生活,可以随时随地拍摄。越来越多的图片堆砌在电脑里。看到杂乱无章的图片,实在感到头痛。手动整理太复杂。基于此,我写了一个小程序,可以将图片按日期整理和查看。按日期查看图片,回忆过去的点点滴滴!   手机拍摄图片时,图片文件会存储拍摄时间,也就是exif信息。通过读取exif信息,可以知晓拍摄时间,程序就是根据该值排序的。查看文件的属性可以看到如下信息: 这个程序有两个功能:按日期整理图片,按日期查看图片。1按日期整理图片功能选项:选择图片存放目录,整理后目录。分类依据:就是分类的粒度,如果选择月,则一个月的图片都放在一个目录。文件操作--复制:源目录文件不删除;移动:源目录下文件则被删除,转移到新目录。整理后目录样式:   2按日期查看图片也可以不对源目录做任何处理,只是按日期查看。选择需要查看的目录,点击扫描。根据图片包含的日期,生成树。点击月份、日;属于该日期的图片,就会显示处理。  后记:程序本身并不复杂,但是用到了多项技术。麻雀虽小五脏俱全。用到的技术有:异步处理、绑定...

XAML属性赋值转换之谜(WPF XAML语法解密)

XAML与XML类似,就是XML延伸过来的。为了更好的表达一些功能,WPF对XML做了扩展,有些功能是WPF在后台悄悄的替你做了。有时候,虽然实现了某个功能,但是对实现原理还是很茫然。今天就讲讲XAML中赋值操作。1通过类型转换赋值赋值是最简单最常见的操作,举例:<ButtonWidth="200"Height="100"></Button>这里把Width值赋值为200;用代码实现赋值,则为Button.With=200;这种赋值操作很直接,大家都能理解。但是仔细想想,感觉有点不对劲。XAML表达式Width="200",这里200是字符串,Width类型是double。字符串200怎么就转换成double了!你会说,200很明显可以转换为double类型,有什么大惊小怪的!有时,程序实现的逻辑操作很傻瓜,人很容易理解的事,程序并不一定能理解。需要你告诉XAML编译器,怎么把字符串型转换成double型。确实有一个转换类悄悄的把字符串型转换成了double型。通过元文件,可以查到Width属性定义。////摘要://获取或设置元素的宽度。////返回结果://...

一款高效视频播放控件的设计思路(c# WPF版)

  因工作的需要,开发了一款视频播放程序。期间也经历许多曲折,查阅了大量资料,经过了反复测试,终于圆满完成了任务。我把开发过程中的一些思路、想法写下来,以期对后来者有所帮助。视频播放的本质  就是连续的图片。当每秒播放的图片超过一定数量,人眼就很难觉察到每帧图像播放间隔,看到的就是连续的视频流。视频播放的过程  必须有数据源,数据源一般是摄像头采集后,再经过压缩传送到程序。摄像头采集的视频信号一般转换为YUV格式、这个格式再经过h264压缩,传送出去。(视频信号不经过压缩,数据量非常大,h264是当今最流行的压缩格式)  程序处理的过程要经过相反的过程。先对h264解压缩获取YUV格式数据,再将YUV格式数据转换为RGB格式。视频控件的功能就是高效的把RGB数据显示出来。后续主要介绍这个处理流程。  h264解压缩采用的ffmpeg库,如何处理解压缩见我另一篇文章:使用ffmpeg实现对h264视频解码。YUV格式转换为RGB格式的原理并不复杂,关键是转换效率,一般的算法占用CPU非常高,我这里也是采用ffmpeg库提供的转换算法。视频播放代码解析  1)播放视频的本质就是rgb数据的...

WPF MVVM 学习总结(一)

---恢复内容开始---1.MVVM简介 在WPF中,MVVM(View-ViewModel-Model)开发模型用的很多,它具有低耦合,可重用行,相对独立的设计和逻辑。所以备受广大开发者的喜爱。View说白了就是前台界面,可以用HTML5,Asp.net等实现,ViewModel是连接层(类似于MVC中的Controller),他将Model层和View层结合起来,并封装好命令,供View层绑定,Model层提供类的对象,供ViewModel可以轻松的访问数据库。2.Demo简介  在VS中创建一个WPF的工程,在里面加入Commands,Models,ViewModels,Views文件名,Commands里面封装了所有的操作命令的事件和委托,继承于ICommand,分别实现了ICommand接口中的CanExecute()方法和 Execute()方法,第一个方法返回bool类型,所有后面增加,删除,IsExist这种动作的操作都可绑定此方法,第二个方法返回空,就是执行所有的操作。还有一个委托CanExecuteChanged,当出现影响是...
代码星球 代码星球·2020-11-21

WPF知识总结(一)

在一个项目中,发现有的项目引用的动态库是一个网页地址,下面就看看这个网页地址怎么来的。目标:新建一个WPF工程,实现一个用户控件的功能。在工程中加入一个类库,然后在类库中增加一个用户控件页面,在主界面中调用用户控件,显示用户控件的内容。1.新建一个工程WPFStyle,增加一个类库Common,在类库中增加一个用户控件的页面,在页面中放入一张图片。如下如所示:2.在他的 AssemblyInfo.cs文件最下面 加入代码[assembly:XmlnsDefinition("http://www.baoyi.com","Common")]这句话的意思就是将当前的Common.dll动态库加入了http://www.baoyi.com网址里面,如果Common下面有文件夹需要继续加入代码[assembly:XmlnsDefinition("http://www.baoyi.com","Common.PrintTemple")]等等。3.在MainWindow中加入引用后需要加入一行代码 xmlns:dd="http://www.baoyi.com"这样后面的的...
代码星球 代码星球·2020-11-21

wpf 计算器布局练习

先看一下windows自带计算机的布局:大概布局能看出,有菜单栏(menu),有显示框(textbox),然后剩下的6行5列的布局先看下代码: <StackPanel><Grid><Grid.RowDefinitions><RowDefinition></RowDefinition></Grid.RowDefinitions><TextBoxName="xianshi"Text="显示框"Height="50"Margin="5,5,5,5"></TextBox></Grid><Grid><Grid.RowDefinitions><RowDefinition></RowDefinition><RowDefinition></RowDefinition><RowDefinition></RowDefinition><RowDefinition></RowDef...
代码星球 代码星球·2020-10-21

WPF非UI线程中调用App.Current.MainWindow.Dispatcher提示其他线程拥有此对象,无权使用。

  大家都知道在WPF中对非UI线程中要处理对UI有关的对象进行操作,一般需要使用委托的方式,代码基本就是下面的写法App.Current.MainWindow.Dispatcher.Invoke(newAction(()=>{//TODO:更改UI相关的操作}));  我以前也总是如此写法,没出现过毛病,可是偏偏就在今日,我在串口接收事件中这样写报错了,错误提示说:“其他线程拥有此对象,此线程不能使用”,对于没有多少底子的我当时肯定是一脸蒙圈了,还是去群里问问吧,一问果然是高手给出了解答,问题就出在对App.Current.MainWindow的调用上,因为这个调用会触发VerfiyAccess(),所以会报线程调用异常的错误。既然知道了问题所在,那解决办法是什么呢?  答案就是,一般都会在一个静态类中存储主窗体的Dispatcher对象,以备不时之需啊,而且非常环保,比处处都要写App.Current.MainWindow.Dispatcher.Invoke这么一长串方便多了。...
首页上一页12345...下一页尾页