图层树右键菜单结合Command操作过程

  根据老师线上培训图层树右键菜单的生成,添加contextMenuStrip后再依次添加、命名ToolStripMenuItem,若将全部‘项’添加Click事件,假如图层树中 矢量和栅格的右键菜单都要添加数据,那么就要写2个添加数据的点击事件,那么可不可以就写一个添加数据的方法节省代码呢?中间如何联通呢?

  解决过程如下:

  1.窗体的toc控件添加‘MouseDown’ 事件,加入代码

     private void tocControlMain_MouseDown(object sender, MouseEventArgs e)  
{
             if (e.Button == MouseButtons.Right)//TOC图层树中右击事件
             {
PIE.AxControls.PIETOCNodeType type = new PIE.AxControls.PIETOCNodeType();//图层树控件节点类型
IMap map = null;
ILayer layer = null;
Object unk = null;
Object data = null;
tocControlMain.HitTest(e.X, e.Y, ref type, ref map, ref layer, ref unk, ref data);// 传递节点数据类型
PIE.AxControls.PIETOCNodeTag tag = new PIETOCNodeTag();
tag.Map = map;//节点所包含的参数类的参数
tag.Layer = layer;
tag.UNK = unk;
tag.Data = data;
mapControl1.CustomerProperty = tag;//参数传给属性信息
switch (type)
{
case PIETOCNodeType.FeatureLayer://矢量
IFeatureLayer featureLayer = layer as IFeatureLayer;
if (featureLayer == null) return;
this.contextMenuStrip_FeatureLayer.Show(tocControlMain, new System.Drawing.Point(e.X, e.Y)); //显示菜单
break; case PIETOCNodeType.RasterLayer://栅格
IRasterLayer pRasterLayer = layer as IRasterLayer;
if (pRasterLayer == null) return;
this.contextMenuStrip1_RasterLay.Show(tocControlMain, new System.Drawing.Point(e.X, e.Y)); //显示菜单
break; case PIETOCNodeType.Map://地图
this.contextMenuStrip_TocMenu.Show(tocControlMain, new System.Drawing.Point(e.X, e.Y));//显示菜单
break;
}
}
}

   2.

点该处然后在属性中的‘MouseUp’右侧添加‘tocMenuItem_MouUpClick’,双击进入编辑代码,下面代码可被图层树右键菜单项 共用,后面重写点击事件,在不同右键菜单实现相同功能可共用代码。

  private void tocMenuItem_MouUpClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)//选择鼠标左键为作用生效键
{
return;
}
ToolStripMenuItem item = sender as ToolStripMenuItem;
if (item == null)
{
return;
}
ICommand command = item.Tag as ICommand;//本人认为 参数类强制转换为ICommand类
if (command == null)
{
return;
}
command.OnCreate(mapControl1); //必须加
command.OnClick();
ITool tool = command as ITool;
if (tool != null)
{
mapControl1.CurrentTool = tool;
}
}

  3.在初始化函数中设置TOC右键菜单,部分如下:

             

private void InitFrm()//初始化窗体
             { //toc图层编辑

2             toolStripMenuItem_DeleteRLayer.Tag = new Command.DelLayerCommand();//删除所有图层

  3             toolStripMenuItem_TocAddData.Tag = new Command.AddDataCommand();

             ModifyStrToolStripMenuItem.Tag = new Command.SpatialReferenceSelectorCommand();

  4.在解决方案资源管理器如图添加文件夹和类:

  5.如下添加Command类:

using PIE.AxControls;
using PIE.Controls;
using PIE.Carto;
namespace PIEAppication.Command
{
class SpatialReferenceSelectorCommand: BaseCommand
{
#region 私有变量
/// <summary>
/// 地图实例
/// </summary>
private IMapControl m_MapControl;
#endregion /// <summary>
/// 构造函数
/// </summary>
public SpatialReferenceSelectorCommand()
{
base.Caption = "坐标系选择改变";
base.ToolTip = "坐标系选择改变";
}
/// <summary>
/// 重写单击按钮事件
/// </summary>
public override void OnClick()
{
//1.获取当前地图
IMap map = m_HookHelper.FocusMap;
//2.实例化空间参考窗口对象
PIE.AxControls.SpatialReferenceSelectorDialog sRSelectorDialog = new SpatialReferenceSelectorDialog();
sRSelectorDialog.SetMap(map); //设置地图(地图对象)
sRSelectorDialog.SpatialReference = map.SpatialReference;
if (sRSelectorDialog.ShowDialog() != 1) return;//1表示确定、0表示取消
map.SpatialReference = sRSelectorDialog.SpatialReference;
(map as IActiveView).PartialRefresh(ViewDrawPhaseType.ViewAll);
}
}
}

  6.当栅格和矢量对象都要设置选择坐标系时,可以都以相同的MouseUp事件、再初始化设置,就可以共用Command类。执行效果如下:

  7.此外发现其它菜单点击方法也可以使用以上,MouseUp事件、Command类进行实现,当软件多处使用相同功能时可简化代码。同理还实现了矢量数据属性表的显示,如下:

  一些软件的右键总是有些便捷的功能,大家可以试试右键菜单功能哦

图层树右键菜单结合Command操作过程的更多相关文章

  1. PIE SDK图层树右键菜单与命令绑定

    1.   功能简介 上一节已经介绍过图层树如何和地图和制图关联,图层树右键菜单主要是基于TocControl控件进行对菜单节点进行控制,TocControl主要作用是显示当前加载的图层有哪些.采用什么 ...

  2. WPF中ContextMenu(右键菜单)使用Command在部分控件上默认为灰色的处理方法

    原文:WPF中ContextMenu(右键菜单)使用Command在部分控件上默认为灰色的处理方法 问题描述 今天发现如果我想在一个TextBlock弄一个右键菜单,并且使用Command绑定,结果发 ...

  3. ASP.NET Aries 入门开发教程8:树型列表及自定义右键菜单

    前言: 前面几篇重点都在讲普通列表的相关操作. 本篇主要讲树型列表的操作. 框架在设计时,已经把树型列表和普通列表全面统一了操作,用法几乎是一致的. 下面介绍一些差距化的内容: 1:树型列表绑定: v ...

  4. arcengine实现右键菜单打开/关闭所有图层

    参考资料:  http://developer.51cto.com/art/201104/256774.htm 参照后自己做的: 关于右键菜单的几个有价值的网址: http://blog.csdn.n ...

  5. 将Sublime Text 添加到鼠标右键菜单的教程方法

    安装notepad++软件,在菜单右键自动会添加“edit with notepad++"的选项,那么怎么将Sublime Text 添加到鼠标右键菜单呢?下面是我的操作过程,希望有帮助! ...

  6. win10 右键菜单添加Git Hash Here

    1.通过在"运行"中输入'regedit',打开注册表. 2.找到[HKEY_CLASSES_ROOT\Directory\Background]. 3.在[Background] ...

  7. 怎样在Windows资源管理器中添加右键菜单以及修改右键菜单顺序

    有时,我们需要在Windows资源管理器的右键菜单中添加一些项,以方便使用某些功能或程序. 比如我的电脑上有一个免安装版的Notepad++,我想在所有文件的右键菜单中添加一项用Notepad++打开 ...

  8. EXT.NET 使用总结(2) ---TreePanel(带右键菜单,节点自定义属性)

    TreePanel(带右键菜单,节点自定义属性) 其实这个树控件也挺好用的.http://www.ztree.me/v3/main.php#_zTreeInfo html <ext:Panel ...

  9. 添加系统右键菜单项 管理员取得所有权(W)(带盾牌)

    @color 0A @title 添加系统右键菜单项 管理员取得所有权(^&W)(带盾牌) by wjshan0808 @echo off echo * >nul reg add HKC ...

随机推荐

  1. Rust中的函数调用

    注意区别语句和表达式哟. Rust是一门基于表示式的语言,牢记!!! fn main() { println!("Hello world!"); another_function( ...

  2. Win10更新后wireshark无法获取网络接口

    一不小心win10自动更新了,打开wireshark发现它无法发现本地的网络接口. 其实解决的办法很简单,就是卸载npcap,安装Win10Pcap即可解决.

  3. 2015年第六届蓝桥杯C/C++程序设计本科B组决赛 ——居民集会(编程大题)

    标题:居民集会 蓝桥村的居民都生活在一条公路的边上,公路的长度为L,每户家庭的 位置都用这户家庭到公路的起点的距离来计算,第i户家庭距起点的距 离为di.每年,蓝桥村都要举行一次集会.今年,由于村里的 ...

  4. VC 静态库与动态库(三)动态库创建与使用_隐式链接

    动态库分为二种,一种隐式链接,另一种显示调用.不论哪种动态库,本质都是运行时动态加载 隐式链接:程序运行时,由编译系统自动加载动态库,然后根据程序的引入表进行重定位,当程序退出时自动卸载动态库 显示调 ...

  5. SGD的动量(Momentum)算法

    引入动量(Momentum)方法一方面是为了解决“峡谷”和“鞍点”问题:一方面也可以用于SGD 加速,特别是针对高曲率.小幅但是方向一致的梯度. 如果把原始的 SGD 想象成一个纸团在重力作用向下滚动 ...

  6. e.preventDefault()

    定义和用法 取消事件的默认动作. 语法 event.preventDefault() 说明 该方法将通知 Web 浏览器不要执行与事件关联的默认动作(如果存在这样的动作).例如,如果 type 属性是 ...

  7. oracle中having与where的区别

    1.where 不能放在group by 的后面 2.HAVING 是跟GROUP BY 连在一起用的,放在GROUP BY 后面,此时的作用相当于WHERE 3.WHERE 后面的条件中不能有聚集函 ...

  8. SSH登录服务器慢

      最近频繁遇到ssh登录到服务器验证慢的这个问题,今天抽时间总结下原因以及解决办法. UseDNS   登录到服务器端查看sshd_config配置文件,当UseDNS项配置为yes时(默认情况下可 ...

  9. 洛谷P3232[HNOI2013]游走

    有一个无向简单连通图,顶点从 \(1\) 编号到 \(n\),边从 \(1\) 编号到 \(m\) 小Z在该图上进行随机游走,初始时小Z在\(1\)号顶点,每一步小Z以相等的概率随机选 择当前顶点的某 ...

  10. 洛谷 P3742 umi的函数

    传送门 思路 \(loceaner\)已经蔡虚鲲到连红题都不会做了 因为有\(special\ judge\)所以我们就可以瞎搞了! 由题目可知,只要有一个\(y[i] > x[i]\)则一定没 ...