在我的工作中遇到有的用户喜欢使用ArcGIS Viewer for Silverlight搭建一些简单的工程,用来作为即将建立的系统的原型系统,或者尝试一些功能,这是一种很方便快捷的方式。但是并不是所有的功能都能够使用Viewer配置完成,有时候扩展开发是必须的。
尤其是有的用户在别的系统中已经有了一系列的数据访问封装好的WCF,只是需要在Viewer中完成数据的调用和显示,那么就更需要对Viewer进行灵活的扩展了。这个系列的文章中,笔者将利用WCF调用数据完成降雨量图的显示。
原本笔者想直接写WCF调用的那一小段,但是发现要是不讲清楚Viewer的扩展开发,后面的很多问题无法引出来。因此本系列将用3个篇幅完成对这个专题的阐述:
第一篇讲述如何对Viewer进行工具的扩展开发;
第二篇讲述如何调用WCF服务进行数据查询;
第三篇讲述查询到的数据如何进行专题图的显示。
利用ArcGIS Viewer for Silverlight配置工程我就不讲述了,各位应该比我还拿手,直接从扩展开发开始:
1.建立一个Silveright工程。
注意选择ASP.Net网站作为Silverlight的宿主。为什么这么做呢?如果大家注意过利用Viewer配置生成的应用程序,那就清楚,它其实是一个站点,我们在工程中也将使用这个站点作为我们调试的宿主。
呵呵,正如上面所说,用站点,因此需要把不需要的文件清空。
我们看到两个工程,上面的工程是Silverlight的宿主站点,下面的是Silverlight的应用程序。宿主站点我们清空后就将利用Viewer生成的站点文件整个拷贝下来;而应用程序则可以将两个xaml都删除。做完这一步,将上面的站点设置成为启动项目,且将index.htm设置成为起始页面。F5运行一下,OK站点顺利显示出来了。
2.设置Silverlight程序的扩展。
在这里提醒大家注意,Viewer的版本要等于或者高于使用的ArcGIS API for Silverlight版本,否者建立的Silverlight扩展是无法添加到Viewer里面的。
首先,在宿主站点中添加Silverlight程序。注意不要勾选“添加引用该控件的测试页”,因为这样做的话,会多出两个没用的页面(勾选了也没关系,删掉多余的页面就是了)。
之后给Silverlight应用程序添加引用
最重要的是以下两个:
最好设置一下这两个动态库不复制到本地,否者在Viewer里面添加您做的扩展会提示警告,说这两个dll已经打包在Viewer里面了。这么做也是让扩展包更小的方法。
做完这些之后就能建立我们自己的扩展工具了!
3.建立类型(以QueryTool为例)
QueryTool继承于ICommand和ISupportsConfiguration,可以直接点击“实现接口”来生成必须的接口。
扩展工具一般有两个类,一个是.cs类,是上述的QueryTool,但是QueryTool并没有用户交互界面,所以还必须有一个类来显示,一般是个xaml,可以继承于任意的UIElement。
下面是我注释的接口作用:
using System;
using System.Collections.Generic;
using System.IO;
using System.Windows.Input;
using System.Xml.Linq;
using ESRI.ArcGIS.Client.Extensibility;
namespace WCFSilverlight
{
public class QueryTool:ICommand,ISupportsConfiguration
{
/// <summary>
/// 用于用户交互的查询窗口界面
/// </summary>
QueryToolWindow TheQueryToolWindow = null;
/// <summary>
/// 存储配置的图层
/// </summary>
public Dictionary<string, string> LayersDic = new Dictionary<string, string>();
/// <summary>
/// 判断是否可以执行Command的方法
/// </summary>
/// <param name="parameter">用于判断的参数</param>
/// <returns></returns>
public bool CanExecute(object parameter)
{
//返回是否可以执行
return true;
}
/// <summary>
/// 是否可以执行的值更改了的事件
/// </summary>
public event EventHandler CanExecuteChanged;
/// <summary>
/// 执行命令
/// </summary>
/// <param name="parameter">执行命令传递的参数</param>
public void Execute(object parameter)
{
this.TheQueryToolWindow = new QueryToolWindow(this);
//将TheQueryToolWindow作为工具交互界面显示出来
MapApplication.Current.ShowWindow("调用WCF", this.TheQueryToolWindow);
}
/// <summary>
/// 配置
/// </summary>
public void Configure()
{
//在这根据配置信息对工具进行配置
}
/// <summary>
/// 读取工具的配置信息,这个信息在Tools.xml文件中有
/// </summary>
/// <param name="configData">标签"Tool.ConfigData"内的值</param>
public void LoadConfiguration(string configData)
{
//笔者是因为将配置信息写成xml格式的了,因此需要这么配置,要是使用普通字符串则可以免除这个操作,直接使用
using (StringReader sr = new StringReader(configData))
{
XDocument ConfigDataXDocument = XDocument.Load(sr);
foreach (XElement layer in ConfigDataXDocument.Root.Elements("layer"))
{
string url = layer.Attribute("url").Value;
string id = layer.Attribute("id").Value;
LayersDic.Add(id, url);
}
}
}
/// <summary>
/// 退出Tools的时候进行的配置文件保存
/// </summary>
/// <returns></returns>
public string SaveConfiguration()
{
//将需要保存的配置文件以字符串形式传递出去,比如笔者比较喜欢使用xml配置,也必须转换成字符串
return string.Empty;
}
}
}
在这一步完成后,我们先不看交互界面里面的类如何写(要是调试出错,可以随意建立一个类名为“QueryToolWindow”的xaml不用做任何操作),我们先到宿主站点中,将Tool配置到Viewer生成的站点中去。
4.配置Tool
首先打开Config/Application.xml,在节点中添加对xap的引用。
<Extensions>
<Extension Url="ClientBin/WCFSilverlight.xap" />
</Extensions>
再在Config/Tools.xml中配置工具的引用
<Tools>
<Tool Label="查询降水量" Icon="Images/toolbar/ToggleSearchCommand16.png" Description="调用WCF查询降水量,并生成专题图">
<Tool.Class>
<QueryTool xmlns="clr-namespace:WCFSilverlight;assembly=WCFSilverlight" />
</Tool.Class>
<Tool.ConfigData>
<queryConfig>
<layer id="Point" url="http://localhost:6080/arcgis/rest/services/CenterValue/MapServer/0"></layer>
</queryConfig>
</Tool.ConfigData>
</Tool>
</Tools>
我们可以看到,Tools节点中添加了Tool;在Tool下面有Tool.Class节点和Tool.ConfigData节点,前者是配置工具使用的类,格式为:
<Tool.Class>
<类名xmlns="clr-namespace:命名空间;assembly=程序集" />
</Tool.Class>
有朋友会问:需要把Silverlight的程序集添加到上面的宿主站点中吗?答案是不用!因为在Application.xml中配置了xap的引用,因此,Viewer的Viewer.xap其实会去解析这些引用的xap,而生成我们的扩展工具自己的xap的时候已经将自己的程序集打包传过去了。感兴趣的朋友可以将xap包的扩展名改为.zip再打开看看。
下面的Tool.ConfigData标签内是随意填什么都行的,我这里是用xml格式表示了一个图层和查询的配置。
配置完成后,运行看看,应该在主窗体右侧工具拦中出现我们自定义的工具了。点开试试,是否出现我们自己定义的QueryToolWindow了?
分享到:
相关推荐
ArcGIS Viewer for Silverlight 最新版 离线文档
ArcGIS Viewer for SilverLight 开发框架 开发指南
ArcGIS API for Silverlight 3.0
ArcGIS Viewer for SilverLight 开发框架部分代码,由于上次只是个开发文档,这次上传部分代码
ArcGIS API FOR silverlight
arcgis api for silverlight 3.0版本,好用
ArcGIS Template Viewer for Silverlight 架构解析及使用说明.pdf
ArcGIS API 3.1 for Silverlight
Map.Layers是一个集合,可以往里面添加layer,这里的layer指的是ArcGIS Server或其他软件发布的地图服务,目前SilverlightAPI中支持的能够直接使用的有ArcGISDynamicMapServiceLayer,ArcGISTiledMapServiceLayer,...
此应用实例是一个全功能的展示应用。运行调试通过,共享出来,大家参考、...实例充分利用的Silverlight 3的功能,比如:触发器、元件结合等,程序结构合理,实例开发了一系列的用户控件来构建应用,可复用性较强....
ArcGIS API for Silverlight 开发入门教程,讲解API的相关使用!
ArcGIS API for Silverlight 3.2安装文件,现在ESRI官网上,Global账户已经无法下载使用,只能使用Developer账户下载。
利用arcgis制作降雨量专题图,掌握arcgis的基本操作
ArcGIS Viewer For Flex v3.7,使用的是agslib-3.7-2014-11-06.swc,config.xml加入自己调用的地图服务的应用实例。
ArcGIS API 3.3 for Silverlight
Source code for ArcGIS Viewer for Flex 2.5
目前最新的api for silverlight 版本,供学习使用。