在前一篇微软的PivotViewer控件编程中,讲到了创建PivotViewer使用的静态数据源的方法。但是手工创建CXML,或者在Excel里面一个个输入PivotViewer里面的数据的确是太麻烦了。不过还好,微软已经给我们提供了动态创建数据源的方法。

动态创建数据源

PivotViewer团队提供了一个开源的工具Pauthor可以用来创建动态的PivotViewer数据源。另外对于ASP.NET程序,他们还提供了另外一个开源库PivotServerTools可以直接用在ASP.NET程序中,这个函数库还自带了一个示例演示了:

l从外部OData数据源生成CXML数据源。

l从数据库中直接生成CXML数据源。

l从文件系统的文件夹中生成CXML数据源。

l还有从TwitterWeb服务中生成CXML数据源。

这里我挑最简单的从文件系统中生成CXML数据源来讲解一下PivotServerTools的用法,如果你有其他的需要,请自己参考那个示例程序

使用PivotServerTools

创建一个ASP.NET程序,并将PivotServerTools添加到工程的引用列表中,这时动态生成CXML数据源就变得很简单了:

1. 新建一个类PicturesFactory继承PivotServerTools.CollectionFactoryBase

2. PicturesFactory中重载MakeCollection函数。

3. 使用Collection.AddItem添加要显示在PivotViewer里的元素(例如图片)。

这里是上面提到的PicturesFactory的源代码:

PicturesFactory:

代码

1 usingSystem;2 usingSystem.IO;3 usingPivotServerTools;4 5 namespacePivot.Test6 {7 publicclassPicturesFactory : CollectionFactoryBase8 {9 publicPicturesFactory()10 {11 Name="photos";12 Summary="我自己的照片";13 }14 15 publicoverrideCollection MakeCollection(CollectionRequestContext context)16 {17 //需要耗费大量的时间,因为照片还是非常多的18 var files=Directory.GetFiles(@"d:\testphotos","*.*", SearchOption.AllDirectories);19 var collection=newCollection();20 collection.Name="我的照片";21 22 foreach(var fileinfiles)23 {24 var info=newFileInfo(file);25 collection.AddItem(Path.GetFileNameWithoutExtension(file),26 file,27 null,28 newItemImage(file),29 newFacet("文件名", Path.GetFileName(file), Path.GetExtension(file)),30 newFacet("文件大小", info.Length/1024),31 newFacet("拍摄日期", info.CreationTime),32 newFacet("连接:",newFacetHyperlink("打开图片", file))33 );34 }35 36 returncollection;37 }38 }39 }

上面的代码中,22行到34行就是将文件系统中的图片添加到CXML文件的方法了。25行到33行在CXML添加具体的元素,例如25行设置了PivotViewer显示图片时,图片的名称,而28行就是将图片本身添加到PivotViewer控件中,PivotServerTools自己会生成Deep Zoom Compositor理解的格式,并且帮我们生成对应的.dzi.dzc文件。29行到32行,分别是添加了图片不同的信息,PivotViewer可以根据这4个种类分类图片,如下图所示:

另外,还需要注意的是第11行,指定了这个CXML文件的文件名,如果你使用PivotServerTools自带的HttpHandler的话,它会将用户请求的CXML文件名和PicturesFactoryName属性对应,这样也方便你在网站中动态提供多个CXML文件。在PivotServerTools的源代码中,FactoryBaseCollection类(在源文件Internals\CollectionFactories.cs中)的TryGet函数用来匹配CollectionFactoryBase.Name和用户请求的CXML文件名。

CollectionFactories.cs:

代码

1 publicCollectionFactoryBase TryGet(stringname)2 {3 CollectionFactoryBase output;4 if(null!=base.Dictionary)5 {6 returnbase.Dictionary.TryGetValue(name.ToLowerInvariant(),outoutput)?output :null;7 }8 else9 {10 returnbase.Items.Find(item=>(0==string.Compare(name, item.Name,true)));11 }12 }

输出动态生成的CXML文件

前面的工作做好以后,你就可以往客户端发送生成的CXML文件了:

1. 动态生成Deep Zoom Compositor需要的.dzc文件。

stringcollectionKey = collection.SetDynamicDzc(collectionFileName);

2. 指定文件类型:

context.Response.ContentType = "text/xml";

3. 动态生成CXML文件并输出到客户端:

collection.ToCxml(context.Response.Output);

PivotServerTools示例代码中,它是通过自定义HttpHandler来实现的,我建议你使用同样的方法,因为前面的步骤只是动态生成了CXML文件和.DZC文件。但是PivotViewer在后续的请求中,会请求图片片断和.DZI文件,这是由Deep Zoom的实现方式决定的。请把下面的HttpHandler源代码添加到你的ASP.NET工程项目里,并在web.config文件中注册这个HttpHandler

动态生成PivotViewer需要的.CXML.DZC.DZI和图片片断的HttpHandler源代码:

代码

1 usingSystem;2 usingSystem.Collections.Generic;3 usingSystem.Linq;4 usingSystem.Web;5 usingPivotServerTools;6 7 namespacePivotTest.Web8 {9 publicclassCxmlHandler : IHttpHandler10 {11 publicvoidProcessRequest(HttpContext context)12 {13 PivotHttpHandlers.ServeCxml(context);14 }15 16 publicboolIsReusable17 {18 get{returntrue; }19 }20 }21 22 publicclassDzcHandler : IHttpHandler23 {24 publicvoidProcessRequest(HttpContext context)25 {26 PivotHttpHandlers.ServeDzc(context);27 }28 29 publicboolIsReusable30 {31 get{returntrue; }32 }33 }34 35 36 publicclassImageTileHandler : IHttpHandler37 {38 publicvoidProcessRequest(HttpContext context)39 {40 PivotHttpHandlers.ServeImageTile(context);41 }42 43 publicboolIsReusable44 {45 get{returntrue; }46 }47 }48 49 50 publicclassDziHandler : IHttpHandler51 {52 publicvoidProcessRequest(HttpContext context)53 {54 PivotHttpHandlers.ServeDzi(context);55 }56 57 publicboolIsReusable58 {59 get{returntrue; }60 }61 }62 63 64 publicclassDeepZoomImageHandler : IHttpHandler65 {66 publicvoidProcessRequest(HttpContext context)67 {68 PivotHttpHandlers.ServeDeepZoomImage(context);69 }70 71 publicboolIsReusable72 {73 get{returntrue; }74 }75 }76 }

web.config中注册这些HttpHandler:

代码

<?xml version="1.0" encoding="UTF-8"?><configuration><system.web><compilationdebug="true"targetFramework="4.0"/><httpHandlers><addpath="*.cxml"verb="GET"type="PivotTest.Web.CxmlHandler"/><addpath="*.dzc"verb="GET"type="PivotTest.Web.DzcHandler"/><addpath="*.dzi"verb="GET"type="PivotTest.Web.DziHandler"/><addpath="*/dzi/*_files/*/*_*.jpg"verb="GET"type="PivotTest.Web.DeepZoomImageHandler"/><addpath="*_files/*/*_*.jpg"verb="GET"type="PivotTest.Web.ImageTileHandler"/></httpHandlers></system.web><system.webServer><handlers><addname="CXML"path="*.cxml"verb="GET"type="PivotTest.Web.CxmlHandler"/><addname="DZC"path="*.dzc"verb="GET"type="PivotTest.Web.DzcHandler"/><addname="DZI"path="*.dzi"verb="GET"type="PivotTest.Web.DziHandler"/><addname="DeepZoomImage"path="*/dzi/*_files/*/*_*.jpg"verb="GET"type="PivotTest.Web.DeepZoomImageHandler"/><addname="ImageTile"path="*_files/*/*_*.jpg"verb="GET"type="PivotTest.Web.ImageTileHandler"/></handlers><!--<staticContent>
            <mimeMap fileExtension=".cxml" mimeType="text/cxml" />
          <mimeMap fileExtension=".dzi" mimeType="text/xml" />
          <mimeMap fileExtension=".dzc" mimeType="text/xml" />
        </staticContent>
--></system.webServer></configuration>

最后,在HTML页面的OBJECT标签里,为PivotViewer指定这个动态的CXML数据源即可:

HTML:

 <object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%"><param name="source" value="ClientBin/PivotTest.xap"/><param name="onError" value="onSilverlightError" /><param name="background" value="white" /><param name="minRuntimeVersion" value="4.0.50401.0" /><param name="autoUpgrade" value="true" /><param name="initparams" value="COLLECTION_URL=http://localhost:12345/photos.cxml" /><a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=4.0.50401.0" style="text-decoration:none"><img src="http://go.microsoft.com/fwlink/?LinkId=161376" alt="Get Microsoft Silverlight" style="border-style:none"/></a></object><iframe id="_sl_historyFrame" style="visibility:hidden;height:0px;width:0px;border:0px"></iframe></div>

其它未尽事宜,请看源码:/Files/killmyday/DynamicPivotDemo.zip

或者PivotServerTools示例程序

微软的PivotViewer控件编程续相关推荐

  1. MFC控件编程之复选框单选框分组框

    MFC控件编程之复选框单选框分组框 一丶分组框 分组框 英文叫做 GroubBox 添加了分组框主要就是分组.好看.不重点介绍 二丶单选框 英文: Raido Button 单选框需要注意的事项 1. ...

  2. 异步委托实现多线程winform控件编程

            private void button1_Click(object sender, EventArgs e)         {             ThreadStart ts  ...

  3. 微软的日历控件为什么从1753年开始?Sqlserver数据库不能插入1753年之前的数据?...

    很久没写日志了,最近在研究公历与农历的,在用微软的Calendar控件时候,无聊看看它最早能到几几年,惊奇的发现居然只到1753年. 原来,现行的公历是格利戈里历法,这个历法并不是连续的,中间缺少了1 ...

  4. [K/3Cloud]进度条控件编程接口

    进度条控件编程接口 1.启动进度查询 this.GetControl<ProgressBar>().Start(2)  //每2秒查询一次进度 2.汇报进度 在插件中重载 OnQueryP ...

  5. 金蝶 K/3 Cloud 服务端控件编程模型

    如下图是服务端已有的控件编程模型 转载于:https://www.cnblogs.com/whlalhj/p/5184148.html

  6. [WP8.1UI控件编程]Windows Phone自定义布局规则

    3.2 自定义布局规则 上一节介绍了Windows Phone的系统布局面板和布局系统的相关原理,那么系统的布局面板并不一定会满足所有的你想要实现的布局规律,如果有一些特殊的布局规律,系统的布局面板是 ...

  7. MFC控件编程之组合框跟列表框

    MFC控件编程之组合框跟列表框 一丶简介 如果要使用组合框跟列表框.那么就要知道.组合框列表框是最核心的东西就是索引. 索引是从0开始的. 二丶组合框列表框常用的方法 AddString(字符串) 添 ...

  8. javascript实现silverlight pivotViewer控件

    一时无事,就用js实现了一个silverlight pivotViewer控件来练手. 实现效果: silverlight PivotViewer说明地址:https://msdn.microsoft ...

  9. [WP8.1UI控件编程]SemanticZoom控件实现分组列表

    11.1.5 SemanticZoom实现分组列表 SemanticZoom控件可以让用户实现一种更加高级的列表,这种列表可以对列表的项目进行分组,同时这个SemanticZoom控件会提供两个具有相 ...

最新文章

  1. [Bat]UNC路径不支持的2种解决方法
  2. python StringIO
  3. python中字典的输出序列_python3:序列_字典(常用基础知识)
  4. 清理linux 服务器的命令行,使用Linux上的Magic SysRq键修复冻结的X服务器,清理重新启动并运行其他低级命令 | MOS86...
  5. PHP Cookbook读书笔记 – 第11章Session和持久化
  6. Python的动态特性(类实例增加属性,动态变量类型)
  7. 计算机办公软件应用操作,基于计算机Word办公软件的使用及操作流程
  8. 利用jad 反编译class文件
  9. 象棋 计算机配置,中国象棋电脑应用规范(五)
  10. 唱歌气沉丹田怎么做 气沉丹田的口诀
  11. 王牌战争服务器维护中多少才能玩,王牌战争最低配置要求一览 什么手机可以玩...
  12. 利用LaTeX写硕士论文历程之安装配置环境
  13. 施工建设企业为什么要使用智慧工地数管理系统?
  14. 嵌入式学习(3)ADC、DMA、通信方式
  15. 《荀子·劝学篇》原文 翻译
  16. web浏览器阻止ActiveX控件
  17. project 2010
  18. 流量录制与回放在vivo的落地实践
  19. 简易的图像点标注工具
  20. 怎么用计算机算三角函数值,手机计算器怎么算三角函数值

热门文章

  1. iOS 状态栏的图标
  2. 064文件方式实现完整的英文词频统计实例
  3. Hibernate 事务总结
  4. 'eval' is null or not an object
  5. Kafka文件存储机制及offset存取
  6. open***无法启动日志报错解决方法
  7. MySQL字符集编码
  8. Windows 10或成为最后一个Windows版本
  9. @include与jsp:include的区别
  10. linux 特殊符号(转)