【技术原创】如何在SilverLight/WPF中给DataGrid动态组织模板内容

      最近在使用SilverLight开发项目,感觉它很适合做企业后台管理软件开发。因为之前只用过WPF,对SilverLight这个子集了解得不是很多。于是我在之前的Asp.Net下写过的一个快速开发框架,就得在SiverLight中重新实现。这期间遇到不少问题,还好都一一解决了。其中我想跟大家分享一下今天中午我遇到的这个问题:如何在SilverLight中给DataGrid动态组织模板内容。

      先说应用场景:

      在需要以列表形式展示数据的界面中,放入一个DataGrid(实际上是我重写过的),再放一个分页控件,设置一下,即可实现自动绑定数据并分页。为了追求代码的简洁与框架的完美,我又添加了一个功能,就是将界面中功能按钮的添加放到分页控件里,这样无论前端界面还是后台代码,都可以变得很简洁。于是乎,在DataGrid中动态组织模板内容就成了一个技术难题。

      首先,我尝试了一下用代码生成DataGridTemplateColumn模板列,但到CellTemplate这一步后就无法再进行下去了,因为DataTemplate对象无法操作其内部元素。在网上找了一些解决方法,无外乎这三种方案:

方案一:动态组织Xaml字符串,转成DataTemplate
      先将要生成的模板内容用Xaml字符串拼起来,然后再使用XamlReader加载,转化成DataTemplate添加到模板列中;

方案二:Xaml文件加载在资源中,转成DataTemplate
      事先将Xaml文件写在资源中,使用时直接加载转化成DataTemplate;

方案三:使用第三方控件

        总结这三种方案,也只有方案一,即动态组合Xaml字符串的能凑合满足我的需求(因为我还涉及到模板里面的控件处理,事件触发等,使用此方案麻烦就大了),而且拼那字符串实在是比较蹩脚。于是我觉得肯定有方案能解决这个问题(毕竟我都能找到DataTemplate对象,只是不能访问内部元素而已)。忽然想到之前我写终端展示框架时用的一个技巧,我想这里可以借来用一下:总结成四个字就是:借鸡下蛋

阅读详细 »

在别处:WPF中如何设置自定义控件不在工具箱中显示

     今天在项目开发中,遇到了一个问题,就是使用VS2010时,WPF中的UserControl如何设置为不在工具箱中显示。之前在开发WinForm时我们知道可以使用[ToolboxItem(false)]属性标记一下即可以。但在WPF里就不一样了,咱在网上了找一阵子,中文里是没有的,最终咱还是找到解决方案了,就是:

      标记:[System.ComponentModel.DesignTimeVisible(false)]。

      真不明白,为什么WPF里又要搞一套呢,而且Microsoft.Windows.Desgin里也有一个设置在工具箱中隐藏的,结果不起作用。

     希望对开发WPF控件的人有所帮助。

【技术原创】京东商城价格图片分析解析源代码下载(C#),附演示程序

      前阵子研究过京东商城的价格图片采集算法,并在《【技术原创】探讨一下京东商城价格图片解析算法的优化,附演示程序下载》一文中详细阐述了这个算法的来源及推理过程,随后我又将自己演示的程序上传供大家下载。今天我就关于京东价格采集分析这块,将C#写的源代码向大家免费开放,希望能对大家有所帮助,同时也希望大家尊重本人的劳动成果,在项目中使用的时候尽量保留代码头部标示的出处。

      下面就是演示程序的截图:

image

阅读详细 »

【经验分享】WebClient/C#/.net如何提高文件下载速度

      在使用.net平台时,经常要用到远程下载文件或者请求网页之类的操作。而下载或者请求网页最简单有效的方法是使用WebClient。这几天因为用到这个,我就多次测试,发现使用多线程下载的话,速度也没提高上来。而在网上找了好一会也没找到满意的答案,最终咱还是找到解决方案了。

      原来WebClient在下载资源或者请求网页时,默认限制了最大连接数是2。也就是说您无论开多少线程系统也只分配两个连接给你下载。问题找到后,那解决也就变得容易了,只要在下载之前,将最大连接数改大就行。也就是在C#里,执行一段代码:

ServicePointManager.DefaultConnectionLimit = 512; // 这里我随便改了一个大点儿的数字,就可以了

      接下来我测试了一下,我在2M的带宽下下载图片文件,速度达到了200K以上,算是比较理想的下载速度了,而且这种下载方式对带宽影响不大,这么大的下载速度下,上网浏览网页也不怎么卡。

【技术原创】探讨一下京东商城价格图片解析算法的优化,附演示程序下载

      发现咱博客开启后技术性的文章写的并不多,这貌似违背当时的初衷啊。文章不多并不表示咱一直都闲着,尤其是在技术方面咱是因为太忙了才没时间写一写,总结总结的。今晚趁还有些精力赶紧将前段日子自己捣鼓的小东西(之一)给大家分享一下。

      前不久我不是扬言说要做两款小软件么,这次我们说到的话题就跟这个有关。我说的那个软件之一就是京东商城的相关软件–我想抓取价格做分析(京东不会提供这个接口),我相信这个肯定是对大家有所帮助的。京东商城的价格展示方式,除了书籍外,基本上都是通过图片来展示的–这个好处是防止有人过于轻易地抓取到价格信息。于是咱想准确地获取到价格的话就只能老实地分析图片喽(其实有的页面里,比如列表页面商品价格是有字符串表示形式的,但那个只用于无目标采集时有用,要是关注某个商品价格变动情况的话,作用就不大了,所以咱无法避免图像分析这一步)。

      图片分析一般有两种思路,一种是与样本库对比,这种方法简单有效,缺点是适应性较差,样本可能要跟着图片不停地变动;另一种就是形状分析,也就是判断图片中数字的形状来判断是哪个字,这种方法效率比前者低,但适应性强;以前我在看验证码识别相关文章时还找到过这种算法,但眼下要用的时候就再也找不着了,方便起见咱也只能用第一种,也就是样本库的方法识别了。

阅读详细 »

捣鼓了一个程序压缩合并混淆小软件【附下载】

NetZ-GUI        最近项目里面需要这样的需求,即将项目里过多的库合并,让客户端看起来瘦一点,于是在网上找了不少资料,最初是看到ILMerge软件,它是由微软内部员工开发,能将使用.Net开发的程序合并在一起,但它有个缺点是对COM组件处理不大友好,程序若引用了COM组件,而这些COM组件若使用了其它COM组件,需要一并合并才会成功,否则程序无法运行。而且程序引用的库需要全部添加才能生成成功,可以说使用起来不是很理想。

后来又找到一款合并软件,NetZ,开源项目。它比ILMerge多个功能,就是能混淆和压缩代码,而且它的限制比较少,你想压缩哪些库就压缩哪些库,不会出现失败信息。对COM组件支持得也比较理想,至少我用AxInterop.WMPLib和Interop.WMPLib均可成功合并,但System.Data.SQLite和刷卡模块等失败,尚未找出可行方案(有找到的也可以跟我联系)。为了方便起见,就在此软件的基础上做了一个可视化压缩工具(NetZ是命令行式,没有界面),软件环境是.net framework2.0及以上,NetZ目前支持最高3.5版本的压缩混淆合并(后续若出现更高版本,可自行更新软件目录下的NetZ文件夹内容)。

阅读详细 »

软件系统架构心得

      毕业这几年来,不敢说设计过多少大项目,小项目也有若干个了。再加上平时设计和开发控件(其实一个控件就是一个小型的系统,它也有自己的架构)也有相关设计,我对软件系统架构也有了一定的心得,现分享一下。

      其实我在系统架构方面的真正提升,还是在设计DIM平台时。当时考虑的因素很多,包括接口和实现的低耦合,业务细分(分离),平台管理方式,权限及日志设计等。当时考虑到用户可能会用多种数据库,多种搭建方式(最简单的就是单机版使用,最复杂的就是自己架构一台服务器),及完全的动态数据表的建立及维护。那时对控件也进行了升级,功能块完全抽象出来,使后台调用更为简洁(用过我那个动态列表和动态表单控件的比较清楚,在1.0版本中业务处理起来还是比较复杂和混乱的,功能扩展比较繁琐)。这样在2.0版本里,动态列表和表单内部职责进行了细分,并把常用功能块抽象,使控件内部逻辑更加清晰,方便维护及扩展。目前比较可惜的就是这个平台最终还是因时间和精力问题被放弃了,不过当作系统架构来练笔的话,还算一个比较不错的例子吧。

阅读详细 »

总结一下这些年在事业上走过的路

      从上大学实习,到广州正式就业,再到转站南京,咱算是基本上没有进过比较大的软件企业,当然也就没多少机会接受很正规的软件培训或者教育。有句话说得好,上帝在关上一扇门时,同时也会打开另一扇门。中小企业有中小企业的好处,就是咱能接触到软件开发的每个流程,大部分功能业务块开发。我也就是在这样的磨练中,慢慢成长起来的。

      先是要感谢一下给我走入DotNet世界的张经理(私下里称张哥),没有他我估计也不会从事DotNet开发,估计也不会有今天的成就(咱最初就是跟张哥学Java,后来马上要入门了,却让我们转DotNet,当初是多么地不愿意啊,后来感觉DotNet也蛮好玩的)。后来张哥又经常安排部门内部培训,教我们设计模式等技术,还安排我去研究前沿技术(我也就是在研究前沿技术时感悟到了许多东西,也就是在那时对开发控件感兴趣,做了第一个控件:分页控件,这为我以后的控件专门开发和系统架构打下了基础)。

阅读详细 »

如此让人惊讶的上市企业

      今天算是比较繁忙的一天,因为助理有事请假回家了。然后接待客户的任务就交给我了(为了不影响同事们集中精力开发)。这下倒不要紧,很多客户就找上来了,涉及到的事情也蛮多,而且我还得想着如何升级到2.2版本及3.0架构事宜。最烦的是有的客户总会问些帮助文档上面都有的问题,而且我都说了,如果是有新功能要做的可以跟我交流,但要问这块那块是怎么回事,如何做的问题,就不要问我了,我目前不负责平台基本功能答疑,我要做的事情需要集中精力才行,所以有问题请先参考一下帮助文档,再不清楚就与我们的业务人员联系,或者与我的助理沟通。

      下午的时候准备给部门开个会议讨论一下当前产品进度的问题,这时某个上市企业跟我们反馈了一下他们在技术上遇到的问题,想让我们做(当时就没说清楚是让我们做还是协助他们完成),我特意打电话过去问了,结果对方说得也不大清楚,意思是这块是让我们做的,而整个产品当时说好了是他们自己做的,怎么这块就交给我们做了呢,都不清楚是不是使用的同一种语言,程序如何衔接呢。于是下午只能去他们那边跑一趟了,去之前我还特意把相关说明文档打印出来以便于跟对方讨论,记下相关的问题。而且我还担心对方会不会比较强大(毕竟人家是上市的),我去了会不会感到压力大或者自卑呢。

阅读详细 »

在Winform中播放视频等【DotNet,C#】

      在项目中遇到过这样的问题,就是如何在Winform中播放视频。当时考察了几种方式,第一种是直接使用Windows Media Player组件,这种最简单;第二种是利用DirectX直接在窗体或者控件上绘图,这种比较复杂。于是采用的是第一种方法。

      先从VS的工具箱里添加Windows Media Player组件,方式是打开工具箱,在最下面的空白处点击右键,选择项,然后在弹出的对话框里切换到Com组件标签项,找到“Windows Media Player”项并选中,确定后将在工具箱中看到多出一个图标,然后就可以将这个图标拖到窗体上进行设置了。

      在这里主要讲下,设置Windows Media Player组件时,有个属性是“无窗口播放”,如果不启用的话,在视频播放时点击鼠标的话,视频会切换到全屏状态,启用就不会发生。但启用的话,视频的清晰度会下降很多(颗粒感变得很明显),不启用鼠标点击又会放大。最初我采用定时将全屏属性改为False来实现,时钟设置成100毫秒或者更小,表现出来的就是用户双击视频后,屏蔽忽地一下变大然后又恢复原样,更危险的是此操作有一定机率(而且不低)会将XP的任务栏暴露出来(因为我们的终端是要全屏显示,不能让用户看到桌面及其它操作项的),于是我反复测试,最终采用的另外一种方式,即过滤窗体事件来直接屏蔽掉视频区域的鼠标消息。具体实现如下:

阅读详细 »