目的:
1.ArcGIS API for Flex没有提供现成的Toc控件,这里来实现自己的Toc控件。
准备工作:
1.在ArcGIS.Server.9.3发布一个叫USA的Map Service,并且把这个Service启动起来。
完成后的效果图:

ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)
开始:
1.启动Flex Builder3新建工程以及引入ArcGIS API for Flex library的开发包,这个过程前面2篇都讲过了这里就不啰嗦了。
2.新建LayersOnAndOff.mxml页面,然后在页面上添加Map控件以及设置ArcGISDynamicMapServiceLayer,添加一个ComboBox控件用来地图切换显示。具体代码如下:

 1ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)<?xml version="1.0" encoding="utf-8"?>
 2ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" backgroundColor="white" xmlns:esri="http://www.esri.com/2008/ags" >
 3ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)    <mx:Array id="arr">
 4ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)        <mx:Object label="USA"  data="http://jh-53a435fbc0e8/ArcGIS/rest/services/USA/MapServer" />
 5ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)        <mx:Object label="USA_2D"  data="http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Population_World/MapServer" />
 6ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)    </mx:Array>
 7ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)    <mx:ComboBox id="myURL" selectedIndex="0" horizontalCenter="-329" dataProvider="{arr}"  y="10">
 8ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)    </mx:ComboBox>
 9ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)    <esri:Map logoVisible="false" panArrowsVisible="true" width="463" height="288" x="33" y="40" borderStyle="solid" borderThickness="3">
10ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)    <esri:ArcGISDynamicMapServiceLayer id="myDynamicService" url="{myURL.selectedItem.data}" load="myDynamicService.defaultVisibleLayers()"/>
11ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)    </esri:Map>
12ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)</mx:Application>

3.对上面的代码做一下解释,首先添加了一个id为arr的对象数组作为ComboBox的数据源,arr的对象数组包含2个对象:一个是上面发布的USA得rest地址,一个是Esri提供的在线的rest地址。然后在Map控件的ArcGISDynamicMapServiceLayer的url属性绑定ComboBox的选择值,这样当ComboBox选择发生变化时地图也会根据rest地址进行切换显示。
4.接下来做Toc控件了,首先在src目录下新添加一个叫uc的目录,然后在uc下新建TreeToc.mxml文件这个就是用来实现Toc功能的。Toc控件这里是用Flex提供的Tree控件的基础上实现的,具体代码如下:

  1ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)<?xml version="1.0" encoding="utf-8"?>
  2ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)<mx:Tree xmlns:mx="http://www.adobe.com/2006/mxml"  width="100%" height="100%"  fontSize="12">
  3ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)<mx:Script>
  4ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)    <![CDATA[
  5ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)        import mx.collections.ArrayCollection;
  6ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)        import com.esri.ags.layers.ArcIMSMapServiceLayer;
  7ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            import com.esri.ags.layers.ArcGISDynamicMapServiceLayer;
  8ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            import com.esri.ags.events.LayerEvent;
  9ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            import com.esri.ags.layers.Layer;
 10ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            import com.esri.ags.layers.LayerInfo;
 11ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            import mx.utils.ObjectUtil;
 12ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            
 13ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            private var layerInfos:Array;
 14ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            //图层
 15ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            private var _layer:Layer;
 16ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            //图层是否更新标识
 17ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            private var _layerChanged:Boolean;
 18ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            //获取图层
 19ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            public function get layer():Layer
 20ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            {
 21ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                return _layer;
 22ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            }
 23ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            //设置图层
 24ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            public function set layer(value:Layer):void
 25ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            {
 26ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                _layer = value;
 27ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                _layerChanged=true;
 28ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                invalidateProperties();
 29ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            }
 30ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            //设置组件属性
 31ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            override protected function commitProperties():void
 32ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            {
 33ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                if (_layerChanged)
 34ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                {
 35ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                    _layerChanged = false;
 36ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                    if(layer)
 37ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                    {
 38ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                        //为layer添加完成后取消鼠标忙碌显示的监听事件
 39ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                        layer.addEventListener(Event.COMPLETE, removeBusyCursor, false, 0, true);
 40ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                        //为layer添加发生错误后取消鼠标忙碌显示的监听事件
 41ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                        layer.addEventListener(IOErrorEvent.IO_ERROR, removeBusyCursor, false, 0, true);
 42ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                        
 43ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                        if(layer.loaded)
 44ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                        {
 45ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                            //如果layer载入完成为DataGrid设置数据源
 46ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                            setDataProvider();
 47ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                        }
 48ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                        else
 49ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                        {
 50ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                            //如果未载入完成为layer添加载入监听事件
 51ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                            layer.addEventListener(LayerEvent.LOAD, layerLoadHandler, false, 0, true);
 52ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                        }
 53ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                    }
 54ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                }
 55ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                super.commitProperties();
 56ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            }
 57ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            //设置数据源
 58ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            private function setDataProvider():void
 59ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            {
 60ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                if(layer is ArcGISDynamicMapServiceLayer)
 61ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                {
 62ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                    layerInfos=ArcGISDynamicMapServiceLayer(layer).layerInfos;
 63ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                }
 64ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                else if(layer is ArcIMSMapServiceLayer)
 65ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                {
 66ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                    layerInfos = ArcIMSMapServiceLayer(layer).layerInfos;
 67ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                }
 68ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                registerClassAlias("com.esri.ags.layers.LayerInfo", LayerInfo);
 69ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                //ObjectUtil.copy方法接受一个对象做为参数而返回一个在内存的新位置的此对象的深度拷贝,类似克隆
 70ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                layerInfos = ObjectUtil.copy(layerInfos) as Array;
 71ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                dataProvider = layerInfos;
 72ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                //labelField="name";
 73ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                
 74ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            }
 75ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            
 76ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            private function layerLoadHandler(event:LayerEvent):void
 77ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            {
 78ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                setDataProvider();
 79ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            }
 80ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            //显示图层方法
 81ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            public function showLayer(layerInfo:LayerInfo):void
 82ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            {
 83ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                var visibleLayers:ArrayCollection;
 84ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                if(layer is ArcGISDynamicMapServiceLayer)
 85ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                {
 86ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                    //获取当前可见图层列表
 87ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                    visibleLayers=ArcGISDynamicMapServiceLayer(layer).visibleLayers;
 88ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                    //在当前可见图层列表中加入要显示的图层
 89ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                    visibleLayers.addItem(layerInfo.id);
 90ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                }
 91ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                else if(layer is ArcIMSMapServiceLayer)
 92ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                {
 93ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                    //获取当前可见图层列表
 94ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                    visibleLayers=ArcIMSMapServiceLayer(layer).visibleLayers;
 95ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                    //在当前可见图层列表中加入要显示的图层
 96ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                    visibleLayers.addItem(layerInfo.id);
 97ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                }
 98ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                //设置鼠标显示状态
 99ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                if (visibleLayers)
100ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                {
101ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                    cursorManager.setBusyCursor();
102ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                }
103ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            }
104ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            //隐藏图层方法
105ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            public function hideLayer(layerInfo:LayerInfo):void
106ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            {
107ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                var visibleLayers:ArrayCollection;
108ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                if(layer is ArcGISDynamicMapServiceLayer)
109ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                {
110ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                    //获取当前可见图层列表
111ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                    visibleLayers=ArcGISDynamicMapServiceLayer(layer).visibleLayers;
112ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                    //查找要隐藏的图层的index
113ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                    var index:int=visibleLayers.getItemIndex(layerInfo.id);
114ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                    //在当前可见图层列表中去除要隐藏的图层
115ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                    if (index != -1)
116ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                    {
117ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                        visibleLayers.removeItemAt(index);
118ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                    }
119ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                }
120ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                else if(layer is ArcIMSMapServiceLayer)
121ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                {
122ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                    //获取当前可见图层列表
123ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                    visibleLayers=ArcIMSMapServiceLayer(layer).visibleLayers;
124ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                    //查找要隐藏的图层的index
125ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                    var index2:int=visibleLayers.getItemIndex(layerInfo.id);
126ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                    //在当前可见图层列表中去除要隐藏的图层
127ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                    if (index2 != -1)
128ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                    {
129ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                        visibleLayers.removeItemAt(index2);
130ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                    }
131ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                }
132ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                //设置鼠标显示状态
133ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                if (visibleLayers)
134ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                {
135ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                    cursorManager.setBusyCursor();
136ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                }
137ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            }
138ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            
139ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            private function removeBusyCursor(event:Event):void
140ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            {
141ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                //删除忙光标
142ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                cursorManager.removeBusyCursor();
143ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            }
144ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)    ]]>
145ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)</mx:Script>
146ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)<mx:itemRenderer>
147ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)    uc.TreeRenderer
148ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)</mx:itemRenderer>
149ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)</mx:Tree>
150ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)

5.对上面的代码做一下解释,首先Toc控件是在Tree控件的基础上实现的,这个Tree控件获取Layers数据作为数据源进行绑定显示,同时提供了显示图层隐藏图层等方法。最后这个Tree添加了一个叫uc.TreeRenderer的itemRenderer(项渲染器),也就是说Tree的每一个节点都是由这个itemRenderer来负责显示。那也就是说还需要实现uc.TreeRenderer的功能。
6.在uc目录下新增加TreeRenderer.mxml的文件,这个因为是itemRenderer所以需要implements="mx.controls.listClasses.IDropInListItemRenderer",具体代码如下:

 1ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)<?xml version="1.0" encoding="utf-8"?>
 2ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" horizontalAlign="left" implements="mx.controls.listClasses.IDropInListItemRenderer">
 3ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)    <mx:Script>
 4ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)        <![CDATA[
 5ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            import com.esri.ags.layers.LayerInfo;
 6ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            import mx.controls.listClasses.BaseListData;
 7ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            
 8ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            //图标图片
 9ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            [Bindable] 
10ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            [Embed(source="assets/Dataframe.GIF")]
11ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            public var layericon:Class; 
12ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            
13ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            private var _listData:BaseListData;
14ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            
15ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            public function get listData():BaseListData
16ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            {
17ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                return _listData;
18ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            }
19ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            
20ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            public function set listData(value:BaseListData):void
21ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            {
22ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                _listData = value;
23ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            }
24ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            //checkbox的点击事件
25ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            private function clickHandler(event:MouseEvent):void
26ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            {
27ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                var layerInfo:LayerInfo = LayerInfo(data);
28ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                
29ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                if (cb.selected)
30ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                {
31ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                    layerInfo.defaultVisibility = true;
32ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                    //调用TreeToc显示图层方法
33ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                    TreeToc(listData.owner).showLayer(layerInfo);
34ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                }
35ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                else
36ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                {
37ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                    layerInfo.defaultVisibility = false;
38ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                    //调用TreeToc隐藏图层方法
39ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                    TreeToc(listData.owner).hideLayer(layerInfo);
40ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)                }
41ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)            }
42ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)        ]]>
43ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)    </mx:Script>
44ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)    <mx:CheckBox id="cb" selected="{data.defaultVisibility}" click="clickHandler(event)"/>
45ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)    <mx:Image source="{layericon}"/>
46ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)    <mx:Label text="{data.name}"/>
47ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)    
48ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)</mx:HBox>
49ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)
7.上面的代码中主要是在HBox控件中放了一个CheckBox、一个Image、一个Label,并且为CheckBok添加了点击事件可以控制图层的隐藏显示。
8.这样完成了Toc控件的开发,接下来是要在LayersOnAndOff.mxml页面使用这个控件,增加如下代码(红色部分):
 1ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)<?xml version="1.0" encoding="utf-8"?>
 2ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" backgroundColor="white" xmlns:esri="http://www.esri.com/2008/ags" xmlns:uc="uc.*"  >
 3ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)    <mx:Array id="arr">
 4ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)        <mx:Object label="USA"  data="http://jh-53a435fbc0e8/ArcGIS/rest/services/USA/MapServer" />
 5ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)        <mx:Object label="USA_2D"  data="http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Population_World/MapServer" />
 6ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)    </mx:Array>
 7ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)    <mx:ComboBox id="myURL" selectedIndex="0" horizontalCenter="-329" dataProvider="{arr}"  y="10">
 8ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)    </mx:ComboBox>
 9ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)    <esri:Map logoVisible="false" panArrowsVisible="true" width="463" height="288" x="33" y="40" borderStyle="solid" borderThickness="3">
10ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)    <esri:ArcGISDynamicMapServiceLayer id="myDynamicService" url="{myURL.selectedItem.data}" load="myDynamicService.defaultVisibleLayers()"/>
11ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)    </esri:Map>
12ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)    <uc:TreeToc layer="{myDynamicService}" height="288" width="210" x="504" y="40" borderThickness="3"/>
13ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)</mx:Application> 
14ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)
9.上面代码的红色部分添加了TreeToc,并且设置了一个layer的属性值是绑定myDynamicService。这样完成了所有功能就可以运行查询效果了。

相关文章: