专栏首页ArcGIS JS API开发【ArcGIS Pro SDK for Microsoft .NET基础-3】系统界面布局及实例化菜单

【ArcGIS Pro SDK for Microsoft .NET基础-3】系统界面布局及实例化菜单

这个系列我们介绍一下ArcGIS Pro SDK for Microsoft .NET的开发,本文是此系列的第三篇文章,我们重新创建一个项目demo之后,进行系统界面布局和菜单自定义。

写在前面

前面的文章介绍了ArcGIS Pro SDK for Microsoft .NET开发环境的搭建,并且我们为创建的demo增加了自己的登陆界面,但是里面的登录逻辑并没有给大家进行详细的介绍,因为那些东西其实是完完全全属于WPF编程的知识,跟Pro SDK关系不大。这篇文章我们来给大家介绍下如何在ArcGIS Pro SDK for Microsoft .NET开发过程中,为我们新建的项目demo进行系统布局,并添加相应的菜单选项。

操作步骤

1、通过第一篇文章中创建demo的方式重新创建一个项目demo,然后我们启动项目后选择一个已有的Pro项目工程文件进入,进入之后就是该项目系统默认的系统布局,如下:

上述的系统布局对于使用过ArcGIS Pro的伙伴们来说简直太熟悉了,这就是Pro软件的布局啊,仅仅是改变了一个左上角的favicon图标而已,将原来Pro的图标换成了一个项目demo创建后自带的绿色圆形的图标。

接下来我们要做的就是改变Pro自带的这种默认布局。主要是去除顶部菜单栏中的所有菜单项,然后加进去我们自定义的菜单,但是我们并不会改变其他的布局,比如左侧的内容面板、中间的地图区域面板、右侧的工具面板等,这些面板的定制我们后续的文章继续给大家介绍。

2、然后在项目根目录下的ConfigurationManager1.cs文件中重写OnUpdateDatabase方法,此方法具体的实现代码如下:

#region Override DAML Database
        protected override void OnUpdateDatabase(XDocument database)
        {
            var nsp = database.Root.Name.Namespace;
            // select all elements that are tabs
            var tabElements = from seg in database.Root.Descendants(nsp + "tab") select seg;
            // collect all elements that need to be removed
            var elements = new HashSet<XElement>();
            foreach (var tabElement in tabElements)
            {
                // skip root and backstage elements
                if (tabElement.Parent == null
                    || tabElement.Parent.Name.LocalName.StartsWith("backstage"))
                    continue;
                var id = tabElement.Attribute("id");
                if (id == null) continue;
                elements.Add(tabElement);
            }
            // remove the elements
            foreach (var element in elements)
            {
                element.Remove();
            }
        }
#endregion

3、此时启动项目,我们会发现菜单栏已经被清空了,如下:

4、接下来我们添加一个菜单按钮。首先在VS中的项目根目录上鼠标右击,依次选择【添加 | 新建项 | ArcGIS Pro 按钮】,然后输入一个按钮名称,这时候你会发现在你的项目根目录下会创建一份以按钮名称为命名的cs代码文件,如下:

5、然后在生成的按钮文件的cs代码中,找到按钮点击事件,添加如下代码,代码含义是当用户点击此按钮时会弹出一个包含有”Hello World”的弹窗:

6、回到ConfigurationManager1.cs文件中,我们将OnUpdateDatabase方法中的下属代码替换为如下代码:

//原来的代码
protected override void OnUpdateDatabase(XDocument database)
{
   ...
   foreach (var tabElement in tabElements)
   {
      ...
      if (id == null) continue;
       
       
//替换后的代码
protected override void OnUpdateDatabase(XDocument database)
{
   ...
   foreach (var tabElement in tabElements)
   {
      ...
      if (id == null || id.Value.StartsWith("MyConfiguration")) continue;//Skip our tabs

通过上图可以看到,其实就是替换了148行的那一行代码。

7、打开项目根目录下的Config.daml文件,我们来组织菜单的显示方式,最终的代码如下:

<ArcGIS defaultAssembly="ProConfigurationdemo2.dll" defaultNamespace="ProConfigurationdemo2" xmlns="http://schemas.esri.com/DADF/Registry" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://schemas.esri.com/DADF/Registry file:///C:/Program%20Files/ArcGIS/Pro/bin/ArcGIS.Desktop.Framework.xsd">
  <AddInInfo id="{4730c594-cc37-48de-ac91-e94536cbb3a3}" version="1.0" desktopVersion="2.5.22081">
    <Name>ProConfigurationdemo2</Name>
    <Description>ProConfigurationdemo2 description</Description>
    <Image>Images\AddinDesktop32.png</Image>
    <Author>esri</Author>
    <Company>Acme</Company>
    <Date>2020/11/13 14:11:11, 2020</Date>
    <Subject>Framework</Subject>
    <!-- Note subject can be one or more of these topics:
                    Content, Framework, Editing, Geodatabase, Geometry, Geoprocessing, Layouts, Map Authoring, Map Exploration -->
  </AddInInfo>
  <Configuration>
    <ConfigurationManager className="ConfigurationManager1" />
  </Configuration>
  <modules>
    <insertModule id="ProConfigurationdemo2_Module" className="Module1" autoLoad="false" caption="Module1">
      <!-- uncomment to have the control hosted on a separate tab-->
      <tabs>
        <tab id="ProConfigurationdemo2_Tab1" caption="Test UI Tab" keytip="Z0">
          <group refID="ProConfigurationdemo2_Group1" />
        </tab>
      </tabs>
      <groups>
        <group id="ProConfigurationdemo2_Group1" caption="Group 1" appearsOnAddInTab="false" keytip="Z1">
          <button refID="ProConfigurationdemo2_TestButton1" size="large" />
        </group>
      </groups>
      <controls>
        <!-- add your controls here -->
        <button id="ProConfigurationdemo2_TestButton1" keytip="Z3" caption="测试按钮" className="TestButton1" loadOnClick="true" smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/GenericButtonBlue16.png" largeImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/GenericButtonBlue32.png">
          <tooltip heading="Tooltip Heading">Tooltip text<disabledText /></tooltip>
        </button>
      </controls>
    </insertModule>
  </modules>
</ArcGIS>

上述代码中对大家有用的就是16行到36行之间的代码。这中间的代码片段的包裹层级其实就是我们Pro SDK开发时的菜单包裹层级,简单理解的话依次是:tab->group->button。除此之外还有更加详细的包裹层级,详情请查看Pro SDK的官网API即可。

8、运行项目,最终项目如下所示:

需要注意的地方:

1、上述效果图中大家可以看到只有一个tab、一个group、一个button。如果想有多个的话直接在Config.daml文件中嵌套这些标签即可,比如下面这样子:

2、按钮添加后默认的图标其实是Pro SDK包里自带的默认图标,就是一个蓝色的矩形框,如果想更改的话,可以自己下载16X1632X32像素大小的图标文件,然后在VS中的项目根目录下的Images目录上鼠标右击,依次选择【添加 | 已有项】,然后选择自己下载的图标加载到Images文件目录中,最后单击Images目录中的图标文件,将其”生成操作”改为”AddInContent”,如下:

如果不按照上述操作,你直接将图标下载到Images文件中,然后在VS中是看不到图标文件的,需要上述过程一样,将其进行手动添加。最后我们在Button按钮上,将图标地址属性改为Images目录即可,如下:

<button id="ImageRecognition_Btn_ImageMosaic" caption="影像拼接" keytip="Z2-2" className="ImageMosaic" loadOnClick="true" smallImage="Images/ImageMosaic16.png" largeImage="Images/ImageMosaic32.png">
          <tooltip heading="Tooltip Heading">Tooltip text<disabledText /></tooltip>
</button>

其中的smallImage和largeImage属性就是控制图标地址的属性,最后的效果类似如下:

3、菜单按钮添加点击事件的时候,务必在VS中的项目根目录上右击,依次选择【添加 | 新建项 | ArcGIS Pro 按钮】来进行操作,然后可以将相应的按钮点击文件拖拽移动至其他的文件目录下。如果一开始直接在其他文件目录下鼠标右击添加按钮文件之后,会出现点击按钮时按钮点击事件不能触发的问题。这里面可能涉及到相关代码文件的命名空间问题,此处没有做过多的研究。

4、如果想实现点击一个菜单按钮,在项目系统的右侧面板直接打开一个Pro中ArcToolBoxes的工具面板的话,直接在按钮点击事件中添加如下代码即可:

protected override void OnClick()
        {
            //MessageBox.Show("样本导出");
            string input_points = "";
            string output_polys = "";
            //string buffer_dist = "2000 Meters";
            var param_values = Geoprocessing.MakeValueArray(input_points, output_polys);
            Geoprocessing.OpenToolDialog("ia.ExportTrainingDataForDeepLearning", param_values);
        }

上述代码中的框选部分其实就是ToolBoxes中的具体工具名称,格式是[工具目录缩写].[工具具体名称],比如上述代码,就是打开了Image Analyst(影像分析工具)下面的ExportTrainingDataForDeepLearning(样本导出)工具,最终结果如下:

工具名称的寻找方式:在Pro中找到具体的工具后,鼠标右击打开工具属性面板即可,如下:

5、文章上述所有的操作步骤,都可以参考Pro SDK的官网文档,具体地址如下:

1、定制Pro菜单面板:
https://github.com/esri/arcgis-pro-sdk/wiki/ProGuide-Configurations
https://github.com/esri/arcgis-pro-sdk/wiki/ProGuide-Ribbon-Tabs-and-Groups
2、代码自动激活ToolBoxes中的工具:
https://github.com/esri/arcgis-pro-sdk/wiki/ProConcepts-Geoprocessing#open-the-tool-dialog-in-the-geoprocessing-pane
本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!
本文分享自作者个人站点/博客:http://www.xbeichenbei.com/复制
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • 【ArcGIS Pro SDK for Microsoft .NET基础-1】环境搭建及Demo创建

    这个系列我们介绍一下ArcGIS Pro SDK for Microsoft .NET的开发,本文是此系列的第一篇文章,我们先来介绍下基础环境的搭建,并创建第一...

    X北辰北
  • 【ArcGIS Pro SDK for Microsoft .NET基础-4】系统部署

    这个系列我们介绍一下ArcGIS Pro SDK for Microsoft .NET的开发,本文是此系列的第四篇文章。这篇文章我们来介绍下如何在部署机器上部署...

    X北辰北
  • ArcGIS Pro3.0已发布,快来看功能

    大家好,我是南南,esri于前段时间发布了全新一代 ArcGIS Pro 3.0,将采用全新的界面.

    陈南GISer
  • 【ArcGIS Pro SDK for Microsoft .NET基础-2】开发实现登录页面

    这个系列我们介绍一下ArcGIS Pro SDK for Microsoft .NET的开发,本文是此系列的第二篇文章,我们在上一节创建的demo基础上,来增加...

    X北辰北
  • ArcGIS for Excel,GIS爱好者制图利器

    ArcGIS for Excel 是一款 Microsoft Office 加载项,可用于从 ArcGIS 向 Microsoft Excel 中添加制图功能。...

    陈南GISer
  • Qt配置使用VS2010进行开发

    它包括跨平台类库、集成开发工具和跨平台 IDE。使用 Qt 您只需一次性开发应用程序,无须重新编写源代码,便可跨不同桌面和嵌入式操作系统部署这些应用程序。

    阳光岛主
  • Qt编写安防视频监控系统(界面很漂亮)

    视频监控系统在整个安防领域,已经做到了烂大街的程序,全国起码几百家公司做过类似的系统,当然这一方面的需求量也是非常旺盛的,各种定制化的需求越来越多,尤其是这几年...

    feiyangqingyun
  • Qt编写安防视频监控系统6-面板开关

    面板开关功能是整个系统最人性化的功能之一,可以对主界面中左侧右侧的各个小面板进行显示和隐藏,当隐藏的时候,另外的同级面板自动拉伸填充,这样就不会显得空洞,直接在...

    feiyangqingyun
  • 配电网WebGIS研究与开发[5]

      用VS2008打开需要发布的网页源文件,执行操作“菜单à生成à发布网站”,然后编译器会将所有的服务器端代码即“*.cs”文件编码成动态链接库即“*.dll”...

    用户1170933
  • Qt编写安防视频监控系统4-删除视频

    一般会有两种处理方式来删除视频,一种是鼠标右键菜单,删除当前视频或者删除所有视频,一种是直接按住当前视频,移到视频通道界面以外就表示删除当前视频,这也是个比较人...

    feiyangqingyun
  • C# Xamarin移动开发基础进修篇

    跟着阿笨一起玩NET
  • Qt编写安防视频监控系统7-全屏切换

    全屏切换这个功能点属于简单的,一般会做到右键菜单中,也提供了快捷键比如alt+enter来触发,恢复全屏则按esc即可,全屏处理基本上都是隐藏通道面板以外的窗体...

    feiyangqingyun
  • Windows Mobile Jump Start Guide

    这篇文章是交给MSTC的作业,发上来和大家共享,希望对入门windows mobile平台开发的朋友有帮助。 ? 1. Windows Mobile简介 Win...

    ShiJiong
  • 最受欢迎的ASP.NET的CMS下载

    引用自:http://www.csdn.net/article/2011-11-28/308172

    Isaac Zhang
  • 地理信息系统(GIS)系列——绪论

    地理信息系统(Geographic Information System 或 Geo-Information system,GIS)有时又称为“地学信息系统”。...

    魏晓蕾
  • 宇宙第一 IDE 叕发布新版了

    Visual Studio 2022 正式版于发布。新版本带有 go-live 许可证,可供生产使用。在 Visual Studio 2019 的基础上,新版集...

    Java技术精选
  • 宇宙第一 IDE 叕发布新版了

    Visual Studio 2022 正式版于发布。新版本带有 go-live 许可证,可供生产使用。在 Visual Studio 2019 的基础上,新版集...

    终码一生
  • 配电网WebGIS研究与开发[3]

      在上一章中,对基本的AJAX进行了一些介绍,但是Web GIS开发框架Web ADF提供的AJAX对上述基本的AJAX又进行了一层封装。ArcGIS Se...

    用户1170933
  • Qt编写安防视频监控系统2-视频播放

    视频播放功能是核心功能之一,为了统一管理接口,统一封装成一个控件,对外提供seturl open close方法即可,不用去管内部的具体处理,这样就可以提供多种...

    feiyangqingyun

扫码关注腾讯云开发者

领取腾讯云代金券