图层树右键菜单结合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.

图层树右键菜单结合Command操作过程-LMLPHP点该处然后在属性中的‘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.在解决方案资源管理器如图添加文件夹和类:图层树右键菜单结合Command操作过程-LMLPHP

  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类。执行效果如下:

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

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

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

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

  一些软件的右键总是有些便捷的功能,大家可以试试右键菜单功能哦图层树右键菜单结合Command操作过程-LMLPHP

04-19 16:57
查看更多