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

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

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

  解决过程如下:

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

 1     private void tocControlMain_MouseDown(object sender, MouseEventArgs e)  
{
             if (e.Button == MouseButtons.Right)//TOC图层树中右击事件
 2             {
 3                 PIE.AxControls.PIETOCNodeType type = new PIE.AxControls.PIETOCNodeType();//图层树控件节点类型
 4                 IMap map = null;
 5                 ILayer layer = null;
 6                 Object unk = null;
 7                 Object data = null;
 8                 tocControlMain.HitTest(e.X, e.Y, ref type, ref map, ref layer, ref unk, ref data);// 传递节点数据类型
 9                 PIE.AxControls.PIETOCNodeTag tag = new PIETOCNodeTag();
10                 tag.Map = map;//节点所包含的参数类的参数
11                 tag.Layer = layer;
12                 tag.UNK = unk;
13                 tag.Data = data;
14                 mapControl1.CustomerProperty = tag;//参数传给属性信息
15                 switch (type)
16                 {
17                     case PIETOCNodeType.FeatureLayer://矢量
18                         IFeatureLayer featureLayer = layer as IFeatureLayer;
19                         if (featureLayer == null)             return;                    
this.contextMenuStrip_FeatureLayer.Show(tocControlMain, new System.Drawing.Point(e.X, e.Y)); //显示菜单 20 break; 21 22 case PIETOCNodeType.RasterLayer://栅格 23 IRasterLayer pRasterLayer = layer as IRasterLayer; 24 if (pRasterLayer == null) return;
this.contextMenuStrip1_RasterLay.Show(tocControlMain, new System.Drawing.Point(e.X, e.Y)); //显示菜单 25 break; 26 27 case PIETOCNodeType.Map://地图
this.contextMenuStrip_TocMenu.Show(tocControlMain, new System.Drawing.Point(e.X, e.Y));//显示菜单
28 break;
29 }
30 }
}

   2. 

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

 1  private void tocMenuItem_MouUpClick(object sender, MouseEventArgs e)
 2         {
 3             if (e.Button == MouseButtons.Right)//选择鼠标左键为作用生效键
 4             {
 5                 return;
 6             }
 7             ToolStripMenuItem item = sender as ToolStripMenuItem;
 8             if (item == null)
 9             {
10                 return;
11             }
12             ICommand command = item.Tag as ICommand;//本人认为 参数类强制转换为ICommand类
13 if (command == null)
14 {
15 return;
16 }
17 command.OnCreate(mapControl1); //必须加
18 command.OnClick();
19 ITool tool = command as ITool;
20 if (tool != null)
21 {
22 mapControl1.CurrentTool = tool;
23 }
24 }

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

1             

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

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

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

4             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类进行实现,当软件多处使用相同功能时可简化代码。同理还实现了矢量数据属性表的显示,如下:

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

 

 

 

  

 

 

 

 

 

转载于:https://www.cnblogs.com/paulhellolipu/p/11240462.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值