概要
ArcGIS Pro SDK for .NET では、「State / Condition」を使うことでタブやグループの表示・非表示、ボタンの活性・非活性を制御できます。また、ProSDK には様々なイベントをサブスクライブすることができ、何かの処理のタイミングで任意の処理を差し込むことができます。
例として、下図のように、プロジェクト名毎に表示・非表示にするタブを変更する方法を紹介します。

手順
- Config.daml ファイルを開き、FAQ「ArcGIS Pro SDK: 新規にタブを作成する方法」を参考に、tabs 要素などを追加します。refID 属性は既存コマンドの ID の「esri_mapping」を指定します。
この例では既存のコマンド群である [ナビゲーション] グループ と [照会]グループをタブに追加しています。- tabs 要素は、Visual Studio で ArcGIS Pro アドイン モジュールのプロジェクトを作成すると、デフォルトで tab 要素が 1 つ、コメントアウトされた状態で用意されています。
- tabs 要素内に、「<tab>…</tab>」を複数追加することで、タブを複数作成することができます。
<!-- DAML --> <tabs> <tab id="CreateNewTab_Tab1" caption="新しいタブ 1"> <group refID="esri_mapping_navigateGroup"/> </tab> <tab id="CreateNewTab_Tab2" caption="新しいタブ 2"> <group refID="esri_mapping_inquiryGroup"/> </tab> </tabs>
- Config.daml ファイルを開き、AddInInfo 要素と modules 要素の間に、condition 要素を追加します。
- condition 要素は、modules 要素より上の「<conditions>…</conditions>」内に記述する必要があります。
- condition 要素を追加することで、ボタンやタブの表示状態を制御することができます。
- 追加した condition 要素の有効/無効の切り替え(手順5)は、要素内に記述するステート「<state id=”任意のお名前”/> 」を用います。
- condition 要素内に、「<insertCondition>…</insertCondition>」を複数追加することができます。
<!-- DAML --> </AddInInfo> <conditions> <insertCondition id ="condition_button1"> <!-- 下記ステートにより、コンディションは true か false で設定され、false に設定されるとタブなどが非表示になります--> <state id="state_button1"/> </insertCondition> <insertCondition id ="condition_button2"> <!-- 下記ステートにより、コンディションは true か false で設定され、false に設定されるとタブなどが非表示になります--> <state id="state_button2"/> </insertCondition> </conditions>
- Config.daml ファイルを開き、tab 要素内に、condition 属性を追加します。
<!-- DAML --> <tabs> <!-- タブ「新しいタブ 1」には、「condition_button1」属性を追加します--> <tab id="CreateNewTab_Tab1" caption="新しいタブ 1" condition="condition_button1"> <group refID="esri_mapping_navigateGroup"/> </tab> <!-- タブ「新しいタブ 2」には、「condition_button2」属性を追加します--> <tab id="CreateNewTab_Tab2" caption="新しいタブ 2" condition="condition_button2"> <group refID="esri_mapping_inquiryGroup"/> </tab> </tabs> - Config.daml ファイルを開き、「<modules>…</modules」内に下記コードを追加します。
autoLoad を true に設定して実装することで、ArcGIS Pro 起動時に自動的にアドインが読み込まれイベントの登録が行われます。<!-- DAML --> <modules> <insertModule id="Module1" className="Module1" autoLoad="true" caption="Module1"> <tabs> ~~~ </tabs>
- Module1.cs ファイルを開き、下記コードを追加します。
//Visual C# internal class Module1 : Module { private static Module1 _this = null; public static Module1 Current => _this ??= (Module1)FrameworkApplication.FindModule("Module1"); // モジュールの初期化イベントをオーバーライド protected override bool Initialize() { // プロジェクトを開くイベントをサブスクライブ ProjectOpenedEvent.Subscribe(OnProjectOpened); return base.Initialize(); } // プロジェクトを開いた際の処理 private void OnProjectOpened(ProjectEventArgs args) { //Config.daml ファイルに記載した condition 要素内に内包するステートを定義します string MyStateID1 = "state_button1"; string MyStateID2 = "state_button2"; // プロジェクト名毎の処理の設定 // プロジェクトの名前が "MyProjectA.aprx" だった場合 if (args.Project.Name == "MyProjectA.aprx") { // ステート「state_button1」を非アクティブ化 //「condition_button1」属性が false になるので、タブ「新しいタブ 1」は非表示になります FrameworkApplication.State.Deactivate(MyStateID1); // ステート「state_button2」をアクティブ化 //「condition_button2」属性が true になるので、タブ「新しいタブ 2」のみ表示されます FrameworkApplication.State.Activate(MyStateID2); } // プロジェクトの名前が "MyProjectB.aprx" だった場合 else if (args.Project.Name == "MyProjectB.aprx") { // ステート「state_button2」を非アクティブ化 //「condition_button2」属性が false になるので、タブ「新しいタブ 2」は非表示になります FrameworkApplication.State.Deactivate(MyStateID2); // ステート「state_button1」をアクティブ化 //「condition_button1」属性が true になるので、タブ「新しいタブ 1」のみ表示されます FrameworkApplication.State.Activate(MyStateID1); } // プロジェクトの名前が "MyProjectA.aprx" "MyProjectB.aprx" 以外 のプロジェクト名だった場合 else { // ステート「state_button1」「state_button2」をアクティブ化 //「condition_button1」「condition_button2」属性が true になる // タブ「新しいタブ 1」「新しいタブ 2」両方が表示されます FrameworkApplication.State.Activate(MyStateID1); FrameworkApplication.State.Activate(MyStateID2); } } }
参考資料
既存の UI は、refID 属性で参照します。refID 属性にいれる値は、下記のリファレンス ページをご参照ください。
<ArcGIS Pro DAML ID Reference>https://github.com/Esri/arcgis-pro-sdk/wiki/ArcGIS%20Pro%20DAML%20ID%20Reference
また、「State / Condition」の詳細は、下記のページをご参照ください。
<ProGuide Code Your Own States and Conditions>
このナレッジはお役に立ちましたか?
フィードバックをいただきありがとうございます!