ElementLayer是ArcGIS API for Silverlight/WPF中的一种图层类型,主要用来承载Silverlight/WPF中的UIElement对象(UIElement),使用ElementLayer有一个主要的优点就是:ElementLayer中的元素会随着地图的变化而变化(缩放/平移)(PS:在元素控件没有固定size的情况下),而不用自己去处理这些UIElement的地理坐标。所以可以选择使用ElementLayer来放置我们想要的Windows控件元素。

比如,当点击GraphicsLayer上的某一点时,弹出一个信息展示界面等功能时就可以用到ElementLayer。

可以先看一下官方ArcGIS API for Silverlight中对ElementLayer用法的介绍:http://help.arcgis.com/en/webapi/silverlight/samples/start.htm#ElementLayer

主要是通过XAML代码来实现的:

<UserControl x:Class="ArcGISSilverlightSDK.ElementLayer"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:esri="http://schemas.esri.com/arcgis/client/2009">
<Grid x:Name="LayoutRoot" Background="White"> <esri:Map x:Name="MyMap">
<esri:ArcGISTiledMapServiceLayer ID="StreetMapLayer" Url="http://services.arcgisonline.com/ArcGIS/rest/services/NGS_Topo_US_2D/MapServer"/> <esri:ElementLayer>
<esri:ElementLayer.Children>
<!--Clickable button-->
<Button x:Name="RedlandsButton" Width="20" Height="20" Content="X"
esri:ElementLayer.Envelope="-117,34,-117,34"
VerticalAlignment="Center" HorizontalAlignment="Center"
Click="RedlandsButton_Click" /> <!--Arrow pointing at Copenhagen from the right-->
<TextBlock Text="&lt;=" HorizontalAlignment="Right"
FontSize="15" Foreground="Blue" FontWeight="Bold" esri:ElementLayer.Envelope="12.5698,55.6765,12.5698,55.6765" />
<!--Arrow pointing at Copenhagen from the left-->
<TextBlock Text="=&gt;" HorizontalAlignment="Left"
FontSize="15" Foreground="Blue" FontWeight="Bold" esri:ElementLayer.Envelope="12.5698,55.6765,12.5698,55.6765" /> <!-- Red box - No size specified. Envelope guides the size -->
<Rectangle Fill="Red" esri:ElementLayer.Envelope="0,0,10,10" /> <!--Editable textbox-->
<TextBox Width="100" Height="20" esri:ElementLayer.Envelope="40,0,40,0"
Text="Editable text" HorizontalAlignment="Right" VerticalAlignment="Bottom" />
</esri:ElementLayer.Children>
</esri:ElementLayer> </esri:Map> </Grid>
</UserControl>

XAML代码中定义了一个ElementLayer,并在ElementLayer.Children集合中添加了Button、TextBlock、TextBox控件元素,通过Live Sample展示,可以发现:没有固定Width和Height的TextBlock和RectangleFill会随着地图的放大/缩小而放大/缩小,而固定Width和Height的Button和Editable textbox大小始终

不变。

如果要在地图上点击某点,弹出一个信息展示界面,ArcGIS API for Silverlight/WPF中已经有一些方法:
http://help.arcgis.com/en/webapi/silverlight/samples/start.htm#MapTipWidget
http://help.arcgis.com/en/webapi/silverlight/samples/start.htm#InfoWindowSimple

但是,如果要展示一个复杂的界面,这些方法可能满足不了我们的要求,比如自定义个UserControl,里面放置多种Windows控件,界面布局也可以自己控制,看这个例子:http://blog.newnaw.com/?p=600

其实现方法如下:
1、先画一个展示界面,比如一个UserControl名为InfoWindow,元素布局由自己控制。

2、声明一个ElementLayer,添加到图层中。

ElementLayer elementLayer;
elementLayer = new ElementLayer();
myMap.Layers.Add(elementLayer);

3、在某个响应事件中,弹出展示界面

private void FeatureLayer_MouseLeftButtonDown(object sender, GraphicMouseButtonEventArgs e)
{
elementLayer.Children.Clear(); //清除上一次的展示界面
InfoWindow infoWindow = new InfoWindow(); //实例化一个界面
//设置ElementLayer的Envelope
Graphic g = e.Graphic;
ElementLayer.SetEnvelope(infoWindow, new Envelope((MapPoint)g.Geometry, (MapPoint)g.Geometry));
elementLayer.Children.Add(infoWindow); //将界面添加到ElementLayer
}

我们来看看自定义界面UserControl的XAML代码:

<UserControl x:Class="InfoWindowOnElementLayer.InfoWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Canvas Width="200" Height="528">
<Grid Width="200" Height="240" Canvas.Left="0" Canvas.Top="0">
<!--Grid中定义其他元素控件-->
</Grid>
</Canvas>
</UserControl>

UserControl中的Canvas和Grid的Width和Height是固定的,且Grid的Height是差不多是Canvas的一半,并处在Canvas的Left和Top方向,即Grid在Canvas的左上方,但是Grid的Width和Canvas的Width是一样的,这样Grid就在整个Canvas的上方,而Canvas的下半部分就为空,为什么要这样设置?因为如果不这样设置,按照上面事件中的响应代码,点击某点的时候,弹出的界面的中心就是点击的某点,这样设置后,用户看到的界面会在点击点的正上方,界面友好。类似的,如果要弹出的界面在点击点的右边,可以将Grid设置在Canvas的Right和Buttom方向,Width和Height为Canvas的一半。

这样设置可以解决弹出界面显示的位置问题,但是因为固定了Width和Height,当地图放大/缩小的时候,弹出界面就没法随地图一起放大/缩小了。

ArcGIS ElementLayer上放置Windows控件的更多相关文章

  1. 利用ArcGIS Engine、VS .NET和Windows控件开发GIS应用

    Dixon 原文  用ArcGIS Engine.VS .NET和Windows控件开发GIS应用     此过程说明适合那些使用.NET建立和部署应用的开发者,它描述了使用ArcGIS控件建立和部署 ...

  2. 向ArcGIS的ToolBarControl中添加任意的windows控件的方法

    概要:在使用ArcEngine开发中,给ToolbarControl添加按钮形式的命令项相信大家都很熟悉了,因为网上的例子很多.但这种使用click调用功能的方式只能满足大部分用户在体验方面的需求,除 ...

  3. 在web中使用windows控件,实现摄像头功能

    最近做的一个Web版的视频会议项目,需要在网页中播放来自远程摄像头采集的实时视频,我们已经有了播放远程实时视频的使用C#编写的windows控件,如何将其嵌入到网页中去了?这需要使用一种古老的技术,A ...

  4. 在Web中使用Windows控件

    版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+] 将Net控件转化为ActiveX控件 1GUID 2实现IObjectSafety接口 3程序集设定 制作安装程序 Web集 ...

  5. 在Web中如何使用Windows控件(ActiveX)[转]

    最近做的一个Web项目,需要在网页中播放摄像头采集的实时视频,我们已经有了播放视频的使用C#编写的windows控件,如何将其嵌入到网页中去了?这需要使用一种古老的技术,ActiveX. 1.将.Ne ...

  6. Delphi对象变成Windows控件的前世今生(关键是设置句柄和回调函数)goodx

    ----------------------------------------------------------------------第一步,准备工作:预定义一个全局Win控件变量,以及一个精简 ...

  7. Windows控件的属性与事件

    Treeview控件重要属性和事件 属性 说明 Nodes Treeview控件中所有树节点 SelectdNode 当前Treeview控件中选定的树节点,如果当前没有选定树节点,返回值为null ...

  8. 在此页上的ActiveX控件和本页上的其他部分的交互可能不安全,你想允许这种交互吗

    转自 http://www.cnblogs.com/zdxster/archive/2011/01/27/1945868.html 在EOS6的项目中,如果采用VC++开发的ActiveX,那么第一次 ...

  9. 在Web上调用Ocx控件

    原文:http://blog.csdn.net/goodadult2012/article/details/6343369 在HTML页面中使用ActiveX控件包含三个基本操作:将控件放入HTML中 ...

随机推荐

  1. ubuntu14.04 server 安装vmware worktation 12

    0) Do the basic system installation of Ubuntu 14.04 LTS (Server or Desktop) 1) wget the installer wg ...

  2. CEF3开发者系列之外篇——IE中JS与C++交互

    使用IE内核开发客户端产品,系统和前端页面之间的交互,通常给开发和维护带来很大的便利性.但操作系统和前端之间的交互却是比较复杂的.具体来说就是脚本语言和编译语言的交互.在IE内核中html和css虽然 ...

  3. ACM/ICPC 之 Prim范例(ZOJ1586-POJ1789(ZOJ2158))

    两道Prim解法范例题型,简单的裸Prim,且两题相较以边为重心的Kruskal解法而言更适合以点为重心扩展的Prim解法. ZOJ1586-QS Network 题意:见Code 题解:直接的MST ...

  4. ACM/ICPC 之 拓扑排序范例(POJ1094-POJ2585)

    两道拓扑排序问题的范例,用拓扑排序解决的实质是一个单向关系问题 POJ1094(ZOJ1060)-Sortng It All Out 题意简单,但需要考虑的地方很多,因此很容易将code写繁琐了,会给 ...

  5. FFmpeg-20160428-snapshot-bin

    ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 S 下一帧 [ -2秒 ] +2秒 ; -1秒 ' +1秒 下一个帧 -> -5秒 F ...

  6. GCD 大中枢派发 简单应用实例

    @interface ViewController () { UIImageView* iv; UIButton* btn; UILabel* lbl; } @end @implementation ...

  7. Android 6.0的运行时权限

    原文  http://droidyue.com/blog/2016/01/17/understanding-marshmallow-runtime-permission/ 主题 安卓开发   Andr ...

  8. 【leetcode】Combination Sum III(middle)

    Find all possible combinations of k numbers that add up to a number n, given that only numbers from ...

  9. 【QT】C++ GUI Qt4 学习笔记2

    Go To Cell 利用QT Desinger做好界面后加入的代码有 gotocelldialog.h #ifndef GOTOCELLDIALOG_H #define GOTOCELLDIALOG ...

  10. 【编程题目】在一个字符串中找到第一个只出现一次的字符。如输入 abaccdeff,则输出 b。

    第 17 题(字符串):题目:在一个字符串中找到第一个只出现一次的字符.如输入 abaccdeff,则输出 b. 思路:此题非常容易. 最开始是想开辟一块空间存储每个字符出现的次数. 但转念一想,似乎 ...