1. 功能简介
上一节已经介绍过图层树如何和地图和制图关联,图层树右键菜单主要是基于TocControl控件进行对菜单节点进行控制,TocControl主要作用是显示当前加载的图层有哪些、采用什么样的符号等,目的是使用户对当前加载的数据和结构有一个总体的把握。
图层树与命令关联绑定是将具体的代码进行封装转换为Command或者Tool,为了简化代码,便于调用,调试,使用简单。
2. 功能实现说明
2.1 . 实现思路及原理说明
一、 界面设计
在界面添加控件ConTextMenuStrip,新建两个ToolStripMenuItem,以添加数据和删除图层为例;
二、 功能实现
图层树的右键菜单的弹出,首先需要右键图层树,触发tocControlMain_MouseClick 点击事件;
1 /// <summary> 2 /// 右键菜单事件 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <param name="e"></param> 6 private void tocControlMain_MouseClick(object sender, MouseEventArgs e) 7 { 8 if (e.Button == MouseButtons.Right)//右键 9 { 10 IMap pMap = null; 11 m_Layer = null; 12 PIETOCNodeType nodeType = PIETOCNodeType.Null; 13 object unk = null; 14 object data = null; 15 16 this.tocControlMain.HitTest(e.X, e.Y, ref nodeType, ref pMap, ref m_Layer, ref unk, ref data); 17 //判断点击的节点是哪个类型,弹出指定的右键菜单 18 if (nodeType == PIETOCNodeType.Map) 19 { 20 //控制菜单项的显示隐藏 21 this.ToolStripMenuItem_LoadData.Visible = true;//显示加载数据菜单选项 22 this.ToolStripMenuItem_DeleteLayer.Visible = false;//不显示删除图层菜单选项 23 } 24 else 25 { 26 //控制菜单项的显示隐藏 27 this.ToolStripMenuItem_LoadData.Visible = false;//不显示加载数据 28 this.ToolStripMenuItem_DeleteLayer.Visible = true;//显示删除图层菜单选项 29 } 30 this.contextMenuStrip1.Show(this.tocControlMain, new Point(e.X, e.Y)); //右键菜单显示 31 } 32 } 33 34 /// <summary> 35 /// 右键菜单加载数据事件 36 /// </summary> 37 /// <param name="sender"></param> 38 /// <param name="e"></param> 39 private void ToolStripMenuItem_LoadData_Click(object sender, EventArgs e) 40 { 41 // 获得要打开Shape数据的路径 42 OpenFileDialog openFileDialog = new OpenFileDialog(); 43 openFileDialog.Title = "选择打开数据"; 44 openFileDialog.Filter = "Shape Files|*.shp;*.000|Raster Files|*.tif;*.tiff;*.dat;*.bmp;*.img;*.jpg|HDF Files|*.hdf;*.h5|NC Files|*.nc"; 45 if (openFileDialog.ShowDialog() != DialogResult.OK) return; 46 47 // 打开图层 48 String filePath = openFileDialog.FileName; 49 ILayer layer = PIE.Carto.LayerFactory.CreateDefaultLayer(filePath); 50 if (layer == null) return; 51 52 // 添加图层到地图并刷新 53 mapControlMain.FocusMap.AddLayer(layer); 54 mapControlMain.ActiveView.PartialRefresh(PIE.Carto.ViewDrawPhaseType.ViewAll); 55 } 56 57 /// <summary> 58 /// 右键菜单删除图层事件 59 /// </summary> 60 /// <param name="sender"></param> 61 /// <param name="e"></param> 62 private void ToolStripMenuItem_DeleteLayer_Click(object sender, EventArgs e) 63 { 64 if (m_Layer == null) return; 65 mapControlMain.FocusMap.DeleteLayer(m_Layer); 66 mapControlMain.ActiveView.PartialRefresh(ViewDrawPhaseType.ViewAll); 67 }
拓展:图层树的命令绑定
图层树右键菜单的选项的具体实现功能方式:一种是直接将代码写在事件里面,(如上面的添加数据和删除图层事件),有时候代码量会很大;另一种是直接封装代码成命令Command或者是Tool,在菜单选项中直接调用命令即可,很明显后者比较轻便且快捷
以修改删除图层事件为例:
1 /// <summary> 2 /// 右键菜单删除图层事件 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <param name="e"></param> 6 private void ToolStripMenuItem_DeleteLayer_Click(object sender, EventArgs e) 7 { 8 //方法一 9 //if (m_Layer == null) return; 10 //mapControlMain.FocusMap.DeleteLayer(m_Layer); 11 //mapControlMain.ActiveView.PartialRefresh(ViewDrawPhaseType.ViewAll); 12 13 //方法二 14 ICommand cmd = new Command.DeleLayerCommand(); 15 cmd.OnCreate(mapControlMain); 16 cmd.OnClick(); 17 }
2.2 .示例代码
项目路径 |
百度云盘地址下/PIE示例程序/11.图层树功能/ PIEDemo_SetBuddy |
数据路径 |
百度云盘地址下/PIE示例数据/栅格数据/ World/World.tif |
视频路径 |
百度云盘地址下/PIE视频教程/11.图层树功能/02.图图层树右键操作.avi |