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. fzu2172 字符串dp

    F - 巡了南山我巡北山 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit ...

  2. 网站标签栏ico设置代码

    放在公共文件的header中 <link rel="Shortcut Icon" href="{APP_PATH}favicon.ico" />

  3. KVC 与 KVO 理解

    KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲解. Key-Value Coding (KVC) KVC,即是指 NSKeyValueCoding,一 ...

  4. git config proxy

    $ export http_proxy=http://proxy.ip.ad.ress:portnumber/ $ export https_proxy=http://proxy.ip.ad.ress ...

  5. 图解SSL/TLS协议(HTTPS的安全层)

    http://blog.csdn.net/wallezhe/article/details/50977337 图解SSL/TLS协议     作者: 阮一峰 日期: 2014年9月20日 本周,Clo ...

  6. JavaScript变量声明

    javascript是一种无类型语言,无类型只是意味着用户不必显示地声明变量的数据类型,但是javascript仍然将根据需要自动进行数据类型转换的. javascript的数据类型可以分为简单数据类 ...

  7. logging模块使用示例

    日志等级说明: UNSET < DEBUG < INFO < WARNNING < ERROR  < CRITICAL import logging logger = l ...

  8. Jenkins安装部署

    官方文档:https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins+on+Red+Hat+distributions#Install ...

  9. python pexpect 学习与探索

    pexpect是python交互模块,有两种使用方法,一种是函数:run另外一种是spawn类 1.pexpect  module 安装 pexpect属于第三方的,所以需要安装, 目前的版本是 3. ...

  10. AIX系统中安装Java6全过程(全部)

    ====================================================   From: GCG TSC pSeries <ibm800p@cn.ibm.com& ...