ArcGIS Pro二次开发禁用某些控件(Tab,Group,Control)--常用于权限管理

在用ArcGIS Pro进行个性化开发时,尤其当客户想增加权限管理时,就会涉及控件的(禁用/启用)和(可见/不可见),下面记录下我的学习过程,方便以后回顾。

ArcGIS Pro SDK for Microsoft .NET中框架部分(关于常见必备知识都在这里)

https://github.com/esri/arcgis-pro-sdk/wiki/ProConcepts-Framework#button

ArcGIS Pro中Manage the Pro UI with conditions地址(通过condition条件来控制控件的可见性)

https://developers.arcgis.com/labs/pro/manage-the-pro-ui-with-conditions/

上代码:

第一步:

在Config.daml中在<AddInfo>标签下加上条件<conditions>标签

以其中第二个为例: 

id="Controls_Toggle_condition" 你要禁用那个控件 就在对应控件增加condition属性并赋值id内容,

注意下面的id名称和group中condition属性

<insertCondition id="Controls_Toggle_condition" caption="Toggle Controls">
      <!-- 我们的条件Controls_Toggle_condition根据这个下面controls_state的状态设置为真或假 -->
      <state id="controls_state" />
    </insertCondition>
<!--第三组-->
        <!--condition="Controls_Toggle_condition"决定该组是否显示-->
        <group id="StatesAndConditions_Group3" caption="Controls Group" appearsOnAddInTab="false" condition="Controls_Toggle_condition">
          <!-- host controls within groups -->
          <!--Core Pro Commands-->
          <toolPalette refID="esri_mapping_newMapPalette" />
          <button refID="esri_core_saveProjectButton" />
          <button refID="esri_core_saveProjectAsButton" />
          <gallery refID="esri_mapping_bookmarksNavigateGallery" />
          <button refID="esri_mapping_mapContextMenu_ExportMap" />
        </group>

 第二步:

在Module1类中Overrides下加入方法ToggleState

 

Module1类代码如下: 

namespace ControlVisibility
{
    internal class Module1 : Module
    {
        private static Module1 _this = null;

        /// <summary>
        /// Retrieve the singleton instance to this module here
        /// </summary>
        public static Module1 Current
        {
            get
            {
                return _this ?? (_this = (Module1)FrameworkApplication.FindModule("ControlVisibility_Module"));
            }
        }
        #region Overrides
        /// <summary>
        /// Called by Framework when ArcGIS Pro is closing
        /// </summary>
        /// <returns>False to prevent Pro from closing, otherwise True</returns>
        protected override bool CanUnload()
        {
            //TODO - add your business logic
            //return false to ~cancel~ Application close
            return true;
        }
        #endregion Overrides

        #region Toggle State
        /// <summary>
        /// Activate or Deactivate the specified state. State is identified via its name. Listen for state changes via the DAML <b>condition</b> attribute
        /// 激活或停用指定的状态。状态通过其名称标识。通过DAML 条件属性侦听状态更改
        /// </summary>
        /// <param name="stateID"></param>
        public static void ToggleState(string stateID)
        {
            if (FrameworkApplication.State.Contains(stateID))
            {
                FrameworkApplication.State.Deactivate(stateID);
            }
            else
            {
                FrameworkApplication.State.Activate(stateID);
            }
        }

        #endregion Toggle State

    }
}

第三步: 

 在对应按钮的点击事件中调用步骤二的方法,并传递字符串标签,标签为步骤一中 <state id="controls_state" />

namespace ControlVisibility
{
    internal class ToggleTab : Button
    {
        protected override void OnClick()
        {
             Module1.ToggleState("controls_state");
        }
    }
}

这样就可以通过点击某个按钮实现Tab的隐藏和显示了(group的隐藏与显示也是这样),具体的demo在文章上部第二个链接中,连接下部github也有对应的demo,可以下载学习下 。

这里有个问题是:针对Tap,Group都可以实现显示与隐藏,但是针对Control只能禁用和启用,我研究很久也没找到解决办法,如果有知道好方法的欢迎补充

猜你喜欢

转载自blog.csdn.net/qq_42539194/article/details/108472634