ArcGIS API for Silverlight开发入门(0):为什么要用Silverlight API? ArcGIS API for Silverlight开发入门(1):Getting Started ArcGIS API for Silverlight开发入门(2):一个基础地图实例 Widgets翻译过来是小玩具。如果使用过Dojo或者ExtJS等js框架肯定会了解到这个“小玩具”也有大用处,能够在很大程度上减少我们的工作量,快速完成功能需求。能减少多大工作量呢?让我们先来,点击这里,看一个例子。
前两节的地图中,总感觉少点什么……对,就是一个sliderbar,有了它感觉就像汽车有了方向盘一样,能够控制方向了。那么来看看实现上面这个例子中的滑块条需要做什么工作吧。 在silverlight中创建一个UserControl,把上面sliderbar的外观和功能都封装在里面。 来看具体工作。vs中,在silverlight工程上右键单击,add,new item,选择silverlight user control,起名叫mapslider,在mapslider.xaml中填如下代码:
xmlns:uc="clr-namespace:customcontrol" 2、在页面中添加这个slider: <Grid x:Name="LayoutRoot" Background="White"> <!--地图在这里--> </esri:Map> <uc:mapslider x:Name="mapslider1"/> </Grid> 3、在初始化的时候对我们自定义控件的Map属性赋值(page.xaml.cs中): public Page() { InitializeComponent(); mapslider1.Map = Map1; } 到此应该有这个感觉,封装比较麻烦,但使用封装好的控件非常简便。这就是Widgets带给我们的好处。目前的beta版中,SilverlightAPI已经替我们完成5个Widgets的封装,它们分别是:Magnifier,ToolBar,BookMark,Navigation,MapTip,其中ToolBar内部使用了ToolBarItemCollection和ToolBarItem等类。还是通过一个例子,来看看这几个控件都长什么样吧(点击这里):
MapTip需要使用到Query Task,以后的小节中再涉及到。现在分别熟悉一下这几个Widgets的用法。 1、ToolBar和Magnifier: 这个和ADF开发中的ToolBar(工具条)是一样的,里面可以添加ToolItem(工具),已实现各种功能,比如平移,缩放等。silverlight中当然要有一些比较好看的效果了,比如把鼠标放在工具条上选择工具的时候,会有放大效果,这个效果是默认的,不能设置;点击一个工具时,该工具会跳动一下,这个是ToolbarItemClickEffect中的Bounce效果(目前只有Bounce和None两个选择),也是默认的。此例中ToolBar里面有三个ToolBarItem,分别是Pan,FullExtent和Magnifier(本身也是一个Widget),下面是ToolBar的布局:
private void MyToolbar_ToolbarItemClicked(object sender, ESRI.ArcGIS.Widgets.SelectedToolbarItemArgs e) { switch (e.Index) { case 0: //pan break; case 1: Map1.ZoomTo(Map1.Layers.GetFullExtent()); break; case 2: break; } } private void Image_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { MyMagnifier.Enabled = !MyMagnifier.Enabled; } 别忘了在page的构造函数中加一句:MyMagnifier.Initialize(Map1);。可以看出,Pan工具不需要任何代码,因为地图本身的默认动作就是Pan,而FullExtent也是利用了Map的ZoomTo()。放大镜的工具是在该图片被鼠标左键按住的过程中激活的(设置enabled属性),只要鼠标左键没有按住放大镜图片,该Widget就设置为不可用。比较有用的是我们可以单独设置放大镜自己的图层及放大倍数,这里放大镜使用的就是StreetMap,倍数为3。 2、BookMark: 这个功能和ArcMap(9.3版本)中的BookMark是一样的,可以像看书一样,为当前地图范围设置一个书签,便于其他时候快速定位到该范围。而查看API中的Bookmark.MapBookmark类(可以利用它对书签的内容进行单个添加或删除),可以发现其实每个书签存储的内容是一个Extent,然后再起一个名字就可以了。添加了bookmark widget后似乎会造成vs中的preview窗口出错。 <!--bookmark--> <Canvas> <esriWidgets:Bookmark x:Name="MyBookmarks" Width="125" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="20" Background="#99257194" BorderBrush="#FF92a8b3" Foreground="Black" Loaded="MyBookmarks_Loaded" /> </Canvas> page.xaml.cs中: private void MyBookmarks_Loaded(object sender, RoutedEventArgs e) { MyBookmarks.Map = Map1; } 3、Navigation: 这个导航条工具是目前网络地图必备的一个控件,但silverlight的功能,可以轻易实现地图的旋转(其实也可以在代码中通过Map.Rotation属性来设置)。经试验这个widget只能放在StackPanel或Grid容器里,如果放在Canvas里的话地图中不会显示。 <!--navigation bar.must be in a stackpanel--> <StackPanel HorizontalAlignment="Left" VerticalAlignment="Bottom"> <esriWidgets:Navigation x:Name="MyNavigation" Margin="5" /> </StackPanel> 同样在page的构造函数中添加一句:MyNavigation.Map = Map1;。 API中的Widgets可以简化我们的工作,拿来即用。但明显的缺陷就是不灵活,如果想使自己的控件不那么千篇一律的话,就需要自己进行开发工作了。 好了,下一节中来学习一个比较重要的概念:GraphicsLayer。 |