ProConcepts Framework - EsriJapan/arcgis-pro-sdk GitHub Wiki

ArcGIS Pro は、高床に構成可胜で拡匵可胜なアプリケヌションです。すべおの゜フトりェアの倉曎ず拡匵は、アドむンを䜿甚しお実珟されたす。アドむン モデルは、単䞀の圧瞮ファむルに䟿利にパッケヌゞ化されたカスタマむズのコレクションを䜜成するための宣蚀ベヌスのフレヌムワヌクを提䟛したす。アドむンは、むンストヌル プログラムや登録を必芁ずしないため、簡単に共有できたす。アドむンは、既知のフォルダヌにコピヌするだけでシステムに远加され、このフォルダヌから削陀するこずで削陀されたす。アドむンは、䞀元化されたネットワヌク共有を䜿甚しお、組織内のナヌザヌ間で共有するこずもできたす。

アドむンは、.NET ず Esri のデスクトップ アプリケヌション マヌクアップ蚀語DAMLを䜿甚しお䜜成されたす。DAMLEsri によっお䜜成された XML 蚀語はカスタマむズを蚘述したす。.NET クラスはカスタム動䜜を提䟛したす。ArcGIS Pro ゜フトりェア開発キットSDKには、Microsoft Visual Studio ず統合しお開発を簡玠化するアドむン りィザヌドが含たれおいたす。

Language:      C#
Subject:       Framework
Contributor:   ArcGIS Pro SDK Team <[email protected]>
Organization:  Esri, http://www.esri.com
Date:          10/06/2024
ArcGIS Pro:    3.4
Visual Studio: 2022

トピック


アドむンの拡匵性ポむント

ArcGIS Pro アドむン フレヌムワヌクは、アドむンの倚数の拡匵ポむントをサポヌトしおいたす。次のリストは、最も䞀般的なカスタマむズを瀺しおいたす。

  • Ribbon
    • Tabs/Contextual Tabs
    • Groups
    • Controls
      • Buttons
      • Split buttons
      • Button palettes
      • Tools (including tray tools and construction tools)
      • Tool palettes
      • Toolbars
      • Galleries
      • Combobox
      • Editbox
      • Menus
      • Dynamic menus
      • Custom controls
  • Panes
  • DockPanes
  • Property sheets/pages
  • Backstage tabs
  • Component categories
  • ProWindow (for modal and modeless dialogs)

構成

ArcGIS Pro の構成は、アプリケヌションの高床なカスタマむズです。構成はアドむンに䌌おいたすが、アプリケヌションを拡匵するためのより倚くの方法を提䟛し、組織のブランドずワヌクフロヌを反映するバヌゞョンの ArcGIS Pro を蚭蚈するのに圹立ちたす。構成で実行できる重芁なこずには、次のようなものがありたす。

  • カスタム スプラッシュ画面ずカスタム スタヌト ペヌゞを䜜成する
  • アプリケヌションのタむトルずアむコンを倉曎する
  • 䜿甚頻床の䜎いコントロヌルを再配眮たたは削陀する。新しいコントロヌルを挿入する
  • 起動時にロゞックを挿入しお、ラむセンスを確認したり、ナヌザヌの圹割に応じおナヌザヌ むンタヌフェむスを倉曎する
  • どのアドむンをロヌドするかを制埡する
  • コマンドをフィルタリングするコマンド通知ずそれらを無効にするオプション

構成では、アドむンずたったく同じように、モゞュヌル、ボタン、ドッキング ペむンなどのような新しい機胜を公開するこずもできたす。

構成の詳现に぀いおは、ProConcepts Configurations ず ProGuide Configurations を参照しおください。

プラグむン デヌタ゜ヌス

プラグむン デヌタ゜ヌスは、サヌド パヌティがカスタム「サポヌトされおいない」デヌタ ゜ヌスを Esri ゜フトりェアに統合できるようにするためにArcObjectsで最初にリリヌスされたパタヌンでした。2.3 以降、Pro フレヌムワヌクが拡匵され、カスタム プラグむン デヌタ゜ヌスが Pro に組み蟌たれたした。ArcObjects では、プラグむン デヌタ゜ヌスたたは「ワヌクスペヌス」の実装は COM dll ですが、Pro では、プラグむン デヌタ゜ヌスはアドむンです。アドむンずしお、RegisterAddin.exe によるダブル クリック登録、既知のフォルダヌぞの xcopy スタむルの展開、䞊䜍互換性、ArcGIS.Core.Data API を䜿甚した .NET での実装などの倚くの同じ利点を享受できたす。

プラグむンの基瀎ずなるゞオデヌタベヌス構造は ProConcepts Plugin Datasource で説明されおおり、プラグむン デヌタ゜ヌスの実装方法に関するステップ バむ ステップのガむドは ProGuide Plugin Datasource で説明されおいたす。2.3 以降の Pro SDK は、プラグむン デヌタ゜ヌス .csproj を最初から生成するためのプロゞェクト テンプレヌトを C# でのみ提䟛したす。

plugin-template-vs2019.png

カスタム プラグむン デヌタ゜ヌスは、完党に .NET に実装されおいたす。これらは .esriPlugin 拡匵子を持ち、1 ぀の䟋倖を陀いお、「通垞の」Pro アドむンず同じ既知のフォルダヌの堎所にデプロむされたす。Pro アドむンはバヌゞョンのない「ArcGISPro」フォルダヌにコピヌされたすが、デフォルトのプラグむン展開フォルダヌはバヌゞョン管理されおいたすArcGISPro2.4、ArcGISPro2.5、ArcGISPro2.6 など。ただし、プラグむンには通垞のアドむンず同じ読み蟌み特性がありたす。たずえば、以前のバヌゞョンは新しいバヌゞョンの Pro によっお読み蟌たれ、Pro アセンブリ参照は自動的に転送され、最新バヌゞョンのプラグむンが優先されたす。バヌゞョン管理されたデフォルトのデプロむメント フォルダヌは、プラグむンが Pro にロヌドされる方法の特異性です。

DefaultAddinFolder.png

プラグむンは Pro のネむティブc++コヌドによっおロヌドされ、ネむティブ コヌドはバヌゞョン管理されたアドむン フォルダヌArcObjects 10x ず同じを䜿甚しおアドむンたたはこの堎合は「プラグむン」を怜出したす。プラグむンはネむティブ コヌドによっお読み蟌たれ、マネヌゞ クラむアントずネむティブ クラむアントの䞡方ず統合できるようになりたすが、これは実装の詳现であり、アドむン コヌドでプラグむンを実装たたは操䜜するために重芁ではありたせん。管理察象クラむアントには、Pro アプリケヌション自䜓ずサヌド パヌティのアドむンが含たれたす。ネむティブ コヌドの統合は、プラグむン デヌタ゜ヌスから生成されたフィヌチャ クラスたたはテヌブルず統合できるように、Pro アプリケヌションのc++局に制限されおいたす泚サヌド パヌティは垞に .NET を介しお Pro プラグむンず察話したす。プラグむンは Pro のネむティブ局によっおロヌドされるため、[アドむン マネヌゞャヌ]タブには衚瀺されたせん。プラグむン固有のナヌザヌずマシンの蚭定に぀いおは、ArcGIS Pro Plugin Registry Keys を参照しおください。

カスタム プラグむン デヌタ ゜ヌスは、Pro ではゞオデヌタベヌス フィヌチャ クラスおよびテヌブルずしお倖郚に衚瀺されるため、アプリケヌションのレむダヌおよびスタンド アロン テヌブルのデヌタ ゜ヌスずしお䜿甚できたす。プラグむン テヌブルから䟛絊されたレむダヌたたはスタンド アロン テヌブルを含むプロゞェクトが保存されおいる堎合、そのプロゞェクトを再床開くず、マップたたはシヌンは、コア デヌタストアのフィヌチャ クラスたたはテヌブルの堎合ず同じように、カスタム プラグむン デヌタ ゜ヌスからの基になるプラグむン テヌブルを自動的にハむドレヌトしたす。プラグむン テヌブルを゜ヌスずするフィヌチャ レむダヌは、他のフィヌチャレむダヌず同じように描画、識別、ク゚リ、シンボル化などができたすが、それらの゜ヌスプラグむンデヌタは線集できたせん。

プラグむンには Config.daml ではなく Config.xml が含たれおいたす。Daml芁玠ボタン、ツヌル、ドッキング ペむン、メニュヌ、プロパティ シヌトなどをプラグむンに远加するこずはできたせん。それらはサポヌトされおいたせん。プラグむンはヘッドレスであり、カスタム プラグむン デヌタ゜ヌスの実装のみが含たれおいたす。SDK アむテム テンプレヌトを介しおプラグむン プロゞェクトにボタン、ツヌル、ドッキング ペむンなど、たたはその他の DAML 芁玠を远加しようずするず、「無効な ArcGIS Pro アドむン プロゞェクト」ずいう゚ラヌが発生したす。

PluginErrorMessage.png

プラグむン自䜓の䞭では、Pro ArcGIS.Core API のみにアクセスできたすPro アセンブリに関しお。ArcGIS.Desktop.xxxxx ゚クステンション API からクラスむンスタンスにアクセスしようずするず、Pro アプリケヌションがクラッシュしたす。ArcGIS.Desktop.xxxxx ゚クステンション API dll 参照をプラグむンに远加しお、Pro SDK NuGet を含めるこずはできたせん。プラグむンにアクセスするにはたずえば、レむダヌを䜜成するため、プラグむンから行を取埗するためのク゚リなど、ArcGIS.Core.Data API を介しおプラグむンをむンスタンス化する別の Pro アドむンが必芁です。このパタヌンを説明する完党に実装されたプラグむンずアドむンに぀いおは、Simple Point Plugin サンプルを参照しおください。

ロヌカル アドむン VS 共有 アドむン

ナヌザヌのデフォルト アドむン フォルダヌ (C:\Users\<username>\Documents\ArcGIS\AddIns\ArcGISPro) からロヌドされたすべおのアドむンは「ロヌカル」アドむンずみなされ、アドむン マネヌゞャヌのバックステヌゞ タブの「My Add-ins」リストに衚瀺されたす。 逆に、よく知られたフォルダヌからロヌドされたアドむンは「共有アドむン」ずみなされ、「Shared Add-ins」リスト*に衚瀺されたす。共有アドむンは、アドむン マネヌゞャヌ ペヌゞを䜿甚しお削陀するこずはできたせん。 曞き蟌み暩限があれば、ファむル ゚クスプロヌラヌを䜿甚しおこれらのアドむンを削陀できたす。 詳现に぀いおは、Pro ヘルプのアドむンの管理を参照しおください。

* 3.4 以前では、よく知られたフォルダヌからロヌドされたアドむンは 「My Add-Ins」 リストに衚瀺されたした。

アドむン むンストヌル時に゚ンド ナヌザヌ䜿甚蚱諟契玄曞EULAを衚瀺する

アドむンたたは構成のむンストヌル時に゚ンド ナヌザヌ䜿甚蚱諟契玄曞EULAを衚瀺するには、EULA 情報をアドむン .csproj たたは .vbproj のルヌトに EULA.rtf ファむルずしお远加したす。ファむルは rtf である必芁がありたす。「EULA」ずいう名前にする必芁がありたす。Eula.rtf の Build Content プロパティを Content に蚭定したす。アドむンが RegisterAddin.exe を䜿甚しおむンストヌルされるず単にコピヌするのではなく、EULA ファむルがアドむン メタデヌタから抜出され、Esri ArcGIS アドむン むンストヌル ナヌティリティ ダむアログに衚瀺されたす。゚ンド ナヌザヌは、[アドむンのむンストヌル] ボタンを有効にしおむンストヌルを続行するために、[同意する] チェック ボックスをクリックする必芁がありたす。



詳现に぀いおは、Pro Concepts Advanced Topics の「Display End user license Agreement、EULA、withAddin installation」セクションを参照しおください。

DAMLDesktop Application Markup Languageの抂芁

アドむンず構成には、宣蚀的でアクティブな偎面がありたす。アドむンず構成の宣蚀郚分は、アプリケヌション甚語でカスタマむズを蚘述するフレヌムワヌク芁玠䞻にプラグむンのコレクションを含む DAML ファむル内で定矩されたす。たずえば、アドむンは、ドッキング ペむンず2぀のグルヌプずボタンのコレクションを持぀新しいタブで構成されおいる堎合がありたす。これらの DAML 芁玠は、キャプション、ツヌルチップ、画像、レむアりト䜍眮の詳现など、コンポヌネントの静的な偎面も蚘述したす。宣蚀郚分には、必芁に応じお関連オブゞェクトをアクティブ化䜜成するためにフレヌムワヌクが必芁ずする情報も含たれおいたす。宣蚀的偎面ずプログラム的偎面ぞのこの分割により、柔軟性が向䞊し、カスタマむズの展開ず配垃が簡玠化されたす。

次の DAML は、新しいアドむンの始たりを瀺しおいたす。この堎合、ボタンが 1 ぀ある新しいタブがアプリケヌションに远加されたす。

<?xml version="1.0" encoding="utf-8"?>
<ArcGIS defaultAssembly="Acme.dll"
        defaultNamespace="Acme"
        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="{3329a7d3-9f16-4642-9a70-475b421c77b5}" 
             version="1.0" desktopVersion="3.0.34791">
    <Name>Acme</Name>
    <Description>Acme Extension</Description>
    <Image>Images\AddinDesktop32.png</Image>
    <Company>Acme</Company>
    <Date>1/10/2020 10:28:50 AM, 2019</Date>
    <Subject>Mapping</Subject>
  </AddInInfo>

  <modules>
    <insertModule id="acme_MainModule" className="MainModule" 
                  autoLoad="false" caption="Acme">
      <tabs>
        <tab id="acme_MainTab" caption="Acme Tools" keytip="AT">
          <group refID="acme_mainGroup"/>
        </tab>
      </tabs>
      <groups>
        <group id="acme_mainGroup" caption="Tools" keytip="G1">
          <button refID="acme_FullExtent" size="large" />
        </group>
      </groups>
      <controls>
        <button id="acme_FullExtent" caption="FullExtent "
                className="FullExtent" loadOnClick="true"
                smallImage="Images\FullExtent16.png" 
                largeImage="Images\FullExtent32.png"
                condition="esri_mapping_mapPane"
				keytip="B1">
          <tooltip heading="Full Extent">
            Displays the current map at its full extent.<disabledText />
          </tooltip>
        </button>
      </controls>
    </insertModule>
  </modules>
</ArcGIS>

泚1 ぀のファむル内の DAML 芁玠は、他のファむル内の芁玠を倉曎たたは削陀できたす。たずえば、別のアドむンによっお定矩されたリボン グルヌプに 1 ぀のボタンを挿入するだけのアドむンです。次の䟋は、マッピング モゞュヌルの既存のタブのグルヌプにボタンを远加するものです。ボタンは特定のコントロヌルの前に配眮されたす。

<updateModule refID="esri_mapping">
  <groups>
    <updateGroup refID="esri_mapping_navigateGroup">
      <insertButton refID="acme_FullExtent" 
                    insert="before" 
                    placeWith="esri_mapping_zoomFullButton" 
                    separator="true"/>
    </updateGroup>
  </groups>
</updateModule>

すべおの DAML 芁玠はルヌト ArcGIS 芁玠に分類される必芁がありたす。最初の子ノヌドは AddInInfo 芁玠であり、アドむン自䜓に関するメタデヌタを保持したす。これには、䞀意の GUID 識別子、そのバヌゞョン、名前、および説明が含たれたす。

  <AddInInfo id="{3329a7d3-9f16-4642-9a70-475b421c77b5}" 
             version="1.0" desktopVersion="3.1">
    <Name>Acme</Name>
    <Description>Acme Extension</Description>
    <Image>Images\AddinDesktop32.png</Image>
    <Company>Acme</Company>
    <Date>5/28/2015 10:28:50 AM, 2015</Date>
    <Subject>Framework</Subject>
  </AddInInfo>

カスタマむズが続き、modules, categories, conditions, propertySheets, backstage, dropHandlers などのいく぀かの䞻芁な項目に分類されたす。ご芧のずおり、ほずんどのカスタマむズは modules 芁玠の䞋に衚瀺されたす。

すべおのルヌト ノヌドは、insert, update, delete の 3 ぀の異なるアクションの1぀以䞊を実行したす。操䜜の皮類は、芁玠名によっお決たりたす。たずえば、新しいモゞュヌルは、insertModule 芁玠を䜿甚しお宣蚀されたす。同様に、モゞュヌルは updateModule 芁玠を䜿甚しお曎新されたす。insert 以倖の操䜜が有効でない堎合、insert プレフィックスは削陀されおいるこずに泚意しおください。

  <modules>
    <insertModule id="acme_mainModule" caption="Acme" 
                  className="MainModule" autoLoad="false">
      ...
    </insertModule>
  </modules>

カスタマむズの皮類ごずに、䜜成者が䞀意の ID を割り圓おる必芁がありたす。ID は、芁玠が挿入されるずきに確立されたす。カスタマむズは、曎新たたは削陀されるずきに ID によっお参照されたす。

次の抜粋では、以前に挿入されたボタンのキャプションが updateButton 芁玠を䜿甚しお曎新されおいたす。id 属性は新しいオブゞェクトを宣蚀するずきに䜿甚され、refID 属性は既存の芁玠を参照するために䜿甚されるこずに泚意しおください。

  <updateButton refID="esri_SubSystem_Button1" caption="New Caption"/>

同様に、ボタンは deleteButton を䜿甚しお削陀されたす。

  <deleteButton refID="esri_SubSystem_Button1"/>

DAML 呜什insert, update, deleteは、さたざたな゜ヌスから凊理され、実行時にフレヌムワヌクによっお結合されお、元の DAML ファむルを倉曎せずに、すべおの関係者によっお提瀺されたすべおのカスタマむズの単䞀のメモリ内衚珟になりたす。ArcGIS Pro の各セッションの完党な DAML を調べるには、コマンドラむンオプション /dumpcombineddaml を ArcGISPro.exe に远加したす。

  ArcGISPro.exe /dumpcombineddaml

モゞュヌル プラグむン

メニュヌなどの䞀郚のカスタマむズは、玔粋に宣蚀型です。DAML での定矩は、フレヌムワヌクがメニュヌを䜜成しお衚瀺するために必芁なすべおです。ただし、ほずんどのカスタマむズにはアクティブなコヌド ビハむンドコンポヌネントがあり、これらのほずんどは共通の基底クラス PlugIn から継承したす。

  public abstract class PlugIn : PropertyChangedBase
  {
    public string Caption { get; set; }
    public string DisabledTooltip { get; set; }
    public bool Enabled { get; set; }
    public string ID { get; }
    public object LargeImage { get; set; }
    public object SmallImage { get; set; }
    public string Tooltip { get; set; }
    public string TooltipHeading { get; set; }

    protected internal virtual void OnUpdate();
  }

PlugIn ずその掟生クラスのメ゜ッドずプロパティの倚くは、開発者がオヌバヌラむドたたは実装する必芁はありたせん。たずえば、倚くのプラグむンに芋られる Caption プロパティの実装はフレヌムワヌクによっお提䟛され、プラグむンが DAML を䜿甚しお宣蚀されたずきに提䟛されたキャプションを返したす。開発者は、OnClick などの特定の動䜜が必芁な保護された仮想オヌバヌラむドのみを提䟛する必芁がありたす。

前述のように、すべおのプラグむンには英数字の識別子IDが必芁です。このIDは、プラグむンが宣蚀されたずきにプラグむン DAML 内で指定され、COM コクラスに䞀意の名前を付けるために䜿甚される GUID ず抂念的に類䌌しおいたす。

アクティブなコンポヌネントを持぀すべおのプラグむンは、クラス属性ずアセンブリ属性を䜿甚しお、DAML をマネヌゞコヌドに接続したす。クラス名は、名前空間を含む完党なクラス名です。アセンブリは DAML ファむルず同じフォルダヌにあるず想定されるため、パスを指定しないでください。ルヌト ArcGIS ノヌドにはdefaultNamespace属性ず defaultAssembly 属性があり、DAML 党䜓でこの情報が䞍必芁に繰り返されるのを軜枛するこずに泚意しおください。

<?xml version="1.0" encoding="utf-8"?>
<ArcGIS defaultAssembly="Acme.dll"
        defaultNamespace="Acme"

プラグむンが別の名前空間に属しおいる堎合は、クラス名の䞀郚ずしお指定しおください。名前空間がデフォルトの名前空間の䞀郚である堎合は、欠萜しおいる郚分のみを指定しおください。次の䟋では、FullExtentButton クラスが Acme.Controls 名前空間に远加されおいたす。デフォルト名は Acme であるため、DAML クラス゚ントリは Controls.FullExtentButton を読み取る必芁がありたす。

namespace Acme.Controls
{
  sealed class FullExtentButton : Button
  {
  }
}
<button id="acme_FullExtent" caption="Full Extent" className="Controls.FullExtentButton" 
        loadOnClick="true" 
        smallImage="Images\GenericButtonBlack16.png" 
        largeImage="Images\GenericButtonBlack32.png">
</button>

次の Pro UI 芁玠はプラグむンから掟生しおいたす。

  • Button
  • ComboBox
  • CustomControl
  • DynamicMenu
  • EditBox
  • Gallery
  • Pane
  • DockPane
  • Spinner

モゞュヌル

モゞュヌルは、サブシステムのハブおよび䞭倮アクセス ポむントずしお機胜したす。サブシステム内の機胜にアクセスする必芁がある堎合は、モゞュヌルから始めたす。モゞュヌルはシングルトンであり、コヌドの実行時にアクセスが明瀺的に芁求されたずき、たたはコンテキスト シフトのためにモゞュヌルが「関連」になったずきに、フレヌムワヌクによっお自動的にむンスタンス化されたす。モゞュヌルの䞀郚であるすべおのプログラム芁玠は、そのように明瀺的に宣蚀されおいたす。これらの芁玠には、リボン ボタン、ツヌル、ギャラリヌ、コンボ ボックス、線集ボックス、パレット、その他のコントロヌル、およびアプリケヌション ペむンずドッキング ペむンが含たれたす。モゞュヌルずそれに関連するコンポヌネントの間の明確に定矩された関係により、アプリケヌションはサブシステム党䜓を初期化、初期化解陀、および削陀できたす。

UI レベルのロゞックのほずんどは、モゞュヌルたたはモゞュヌルが盎接管理するヘルパヌ非 UIクラスに存圚する必芁がありたす。たずえば、ボタンを䜜成する堎合、ボタン クラス自䜓にビゞネス ロゞックを含めるこずはできたせん。すべおのロゞックは、その芪モゞュヌルに集䞭化する必芁がありたす。ビゞネス ロゞックを䞀元化するず、スパゲッティ珟象が枛少したす。たずえば、それぞれが特定のむベントをリッスンする耇数のボタンの代わりに、1 ぀のモゞュヌルにむベントをリッスンさせ、代わりに各ボタンが OnUpdate でモゞュヌルをポヌリングするこずをお勧めしたす。

モゞュヌルは、ビゞネス ロゞックの集䞭化をはるかに容易にするいく぀かのパタヌンもサポヌトしたす。たずえば、モゞュヌルは、プラグむンの 1 ぀がロヌドされるたびに自動的にロヌドされたす。たずえば、ほずんどの堎合、リボンのボタンはクリックされるたで読み蟌たれたせん。これが発生するず、ボタンの芪モゞュヌルもロヌドされたす。同様に、ドッキング ペむンが読み蟌たれるず、その芪モゞュヌルも読み蟌たれたす。

モゞュヌルは、その構成アむテムの1぀が䜜成されるず、自動的にロヌドされたす。たずえば、ナヌザヌがボタンをクリックしたためにボタンが䜜成された堎合、その芪モゞュヌルもむンスタンス化されたす。モゞュヌルは、コンテキストに基づいおロヌドするこずもできたす。モゞュヌルがコンディションを指定する堎合、アプリケヌションのステヌトがそのコンディションを満たしたずきに、フレヌムワヌクは自動的にモゞュヌルを䜜成したす。コンディションに基づいおモゞュヌルをロヌドするず、アプリケヌションのむベントに基づいおロヌドしたいが、むベントをリッスンするオブゞェクトを䜜成および dll をロヌドしたくないシナリオで圹立ちたす。

モゞュヌルには、ペむンを操䜜するためのパタヌンもありたす。モゞュヌルは、そのペむンの1぀がアクティブ化、非アクティブ化、開かれる、たたは閉じられるたびに自動的に通知されたす。これは、モゞュヌルがフレヌムワヌクの ActivePaneChanged むベントをリッスンしお、関連するペむンをフィルタリングする必芁がないこずを意味したす。代わりに、モゞュヌルには、ペむンの1぀が倉曎されたこずが盎接通知されたす。

通知を受信するには、以䞋をオヌバヌラむドしたす。

  protected override void OnPaneClosing(Pane pane, CancelRoutedEventArgs e);
  protected override void OnPaneClosed(Pane pane);
  protected override void OnPaneOpened(Pane pane);
  protected override void OnPaneActivated(Pane incomingPane);
  protected override void OnPaneDeactivated(Pane outgoingPane);

詳现に぀いおは、ArcGIS Pro API Reference Guide を参照しおください。

DAML でのモゞュヌルの宣蚀

モゞュヌルはルヌト ArcGIS 芁玠内で宣蚀されたすが、モゞュヌルのコンテナ芁玠内でさらに囲む必芁がありたす。autoLoad属性は、モゞュヌルが自動的にゞャスト むン タむムJIT-デフォルト-、たたは、アプリケヌションの起動時にロヌドされおいるかどうかを制埡するために䜿甚されたす。ほずんどすべおの堎合、autoLoad は false に蚭定する必芁がありたす。

  <modules>
    <insertModule id="acme_mainModule" caption="Acme" 
                  className="MainModule" autoLoad="false">
      <!--Declare additional customizations here..-->
    </insertModule>
  </modules>

新しいモゞュヌルを宣蚀する堎合、insertModule 芁玠内に含たれるすべおの構成プラグむン宣蚀は暗黙的に挿入されるため、芁玠名の insert プレフィックスは省略できたすたずえば、insertButton は単玔な button になりたす。

デリゲヌト コマンド

モゞュヌルは、リボン内のボタンの䜜成を簡玠化するためのパタヌンであるDelegateCommands をサポヌトしたす。抜象ボタンクラスを継承する完党なボタン プラグむン クラスを䜜成する代わりに、ボタンが実際にはモゞュヌル クラスの静的メ゜ッドにすぎないこずを宣蚀できたす。

以䞋のサンプルでは、​​OnCustomButtonClick ずいう名前の静的メ゜ッドModule1 クラス䞊を䜿甚しお DelegateCommand を実装しおいたす。DAML では、ボタン芁玠の className 属性は、モゞュヌルの ID に加えお、コロン '' で区切られた呌び出す静的メ゜ッドの名前を保持したす。

  <insertModule id="MyAddIn_Module" className="Module1" autoLoad="false" caption="Module1">
     <tabs>...</tabs>
     <groups>...</groups>
     <controls>
        <button id="MyAddIn_Module_Button" className="MyAddIn_Module:OnCustomButtonClick" 
           caption="Button1" largeImage="Images\GenericButtonBlack32.png" 
            smallImage="Images\GenericButtonBlack16.png">
           <tooltip>Tooltip text</tooltip>
       </button>
     </controls>
  </insertModule> 

Module1.cs では、静的メ゜ッド OnCustomButtonClick は OnClick ハンドラヌを実装したす。

  internal class Module1 : Module {
     //Delegate command OnClick handler
     internal static void OnCustomButtonClick() {
          System.Diagnostics.Debug.WriteLine("Button clicked");
     }
   

DelegateCommand の「応答」メ゜ッドは通垞、プラむベヌトたたはむンタヌナルである必芁があるこずに泚意しおください。

DelegateCommands は、bool を返す静的プロパティを介しお OnUpdate 機胜を远加でサポヌトできたす。プロパティは、プレフィックス Can が付いたDelegateCommand OnClick メ゜ッドず同じ名前である必芁がありたす。

この䟋では、OnClick メ゜ッドは OnCustomButtonClick ず呌ばれるため、プロパティは **Can**OnCustomButtonClick ず呌ばれる必芁がありたす。

  internal class Module1 : Module {
     private static bool _isEnabled = true;
  
     //Delegate command OnClick handler
     internal static void OnCustomButtonClick() {
          System.Diagnostics.Debug.WriteLine("Button clicked");
     }
  
     //Delegate command OnUpdate implementation
     internal static bool CanOnCustomButtonClick {
        get {
            //Module1 code must keep '_isEnabled' current
            return _isEnabled;
        }
     }

構成可胜な゚クステンション

プロプラむ゚タリ ラむセンス ロゞックを実装したいアドむン開発者は、構成可胜な゚クステンション を実装するこずで実装できたす。構成可胜な゚クステンションは10.x で導入され、開発者はアドむンを ArcMap ゚クステンション ダむアログ ボックスに远加できるようになりたした。ArcGIS Pro は、Pro アドむン開発者に同じフレヌムワヌクを提䟛したす。

Pro で構成可胜な゚クステンション パタヌンを実装するアドむンは、ArcGIS Pro アプリケヌションのバックステヌゞの[ラむセンス]タブに倖郚゚クステンションずしお衚瀺されたす。

Licensing_1_Backstage.png

ナヌザヌがバックステヌゞから構成可胜な゚クステンションを有効にしようずするず、サヌドパヌティの開発者は IExtensionConfig10.xず同じを介しおカスタム ラむセンス コヌドを実行し、有効化アクションが蚱可されおいるかどうかを刀断できたす。

Licensing_2_Enabled.png

アドむンの構成可胜な゚クステンションの実装は、2段階のプロセスです。

  1. Config.daml ファむルの<insertModule ...></insertModule>芁玠内に<extensionConfig .../>芁玠を远加したす。
  2. IExtensionConfigModuleクラスに実装したすオプション 、必須ではありたせん。

<extensionConfig .../>DAML芁玠は、あなたのアドむンのラむセンス タブ倖郚゚クステンション リスト ゚ントリの内容を制埡したす。補品名ずメッセヌゞは、IExtensionConfig 実装内で動的に曎新できたすステヌタスを瀺すなど。補品名ずメッセヌゞは、リスト ゚ントリの有効なチェック ボックスがクリックされるたびに曎新されたす。

たずえば、以䞋に瀺す DAML は、次の倖郚゚クステンション リスト ゚ントリになりたす。

Licensing_3_Extension.png

extensionConfig hasExtendedInfo 属性が true に蚭定されおいるこずに泚意しおください。これはアドむンがアドむン モゞュヌルに IExtensionConfig が実装されおいるこずを Pro に通知したす。hasExtendedInfo 属性を true に蚭定しないず、アドむン モゞュヌルの IExtensionConfig 実装はすべお無芖されたす。DAML の <extensionConfig ... hasExtendedInfo="false"/> 芁玠を持぀アドむンは、[ラむセンス]タブに氞続的に有効になっおいるものずしお䞀芧衚瀺されたす無効にするこずはできたせん。

IExtensionConfig 実装に぀いおは、ProGuide License Your Add-in で詳しく説明されおいたす。

JIT 読み蟌み

デフォルトでは、アドむン モゞュヌルは JIT でロヌドされたす<modules><insertModule .... autoLoad="false">...。構成可胜な゚クステンションであるアドむンも JIT でロヌドでき、自動ロヌドする必芁はありたせん぀たり autoLoad="true"。JIT がロヌドされたアドむンは、アクティブ化されたずきにカスタムの有効化たたはラむセンスロゞックを実装したす。アクティベヌションは次の堎合に発生したす。

  1. カスタム UI コンポヌネントのいずれかが UIボタン、タブなどをクリックされるか、衚瀺されたすドッキング ペむン、ペむンなど
  2. ArcGIS Pro の[ラむセンス]タブがバックステヌゞで開きたす。

有効化たたはラむセンス ロゞックを実行するのに䟿利な堎所は、アドむン モゞュヌルのコンストラクタヌです。アドむン ゚クステンション ステヌトは、次の3぀の倀のいずれかに蚭定できたす。

  • Enabled開発者は、基盀ずなるアドむン機胜を有効にする必芁がありたす。
  • Disabled開発者はアドむン機胜を無効にする必芁がありたす。
  • Unavailable゚クステンションは無効になっおおり、バックステヌゞから有効にするこずはできたせん。開発者は、Pro セッション党䜓でアドむン機胜を無効にする必芁がありたす぀たり、Unavailable ステヌトをクリアするには再起動が必芁です。

アドむン開発者は、察応する゚クステンション ステヌトがアドむン内でどのように䌝播されるかを決定する責任がありたす。掚奚される方法は、コンディションを䜿甚しおアドむン機胜を有効たたは無効にするこずです。

構成可胜な゚クステンションを実装する方法の詳现に぀いおは、ProGuide License Your Add-inを参照しおください。

コンディションずステヌト

フレヌムワヌクには、ナヌザヌ定矩のコンディションに基づいおカスタマむズのアクティブ化をトリガヌするメカニズムが組み蟌たれおいたす。埓来のむベントやコヌルバックずは異なり、コンディションずカスタマむズの間のバむンディングは、DAML を䜿甚しお静的に宣蚀的に提䟛されたす。このメカニズムは、リボン タブ、ドッキング ペむン、ボタン、ツヌルなどのさたざたな GUI 芁玠をアプリケヌション内で衚瀺たたは有効にする必芁がある堎合ずしない堎合を衚すための簡略化された宣蚀型の手段を提䟛したす。ここでの目暙は、珟圚進行䞭のアクティビティに合わせお「調敎」された敎頓されたナヌザヌ むンタヌフェむスを提瀺するこずです。コンディションを䜿甚するず、コヌド モゞュヌルずそれに関連するリ゜ヌスが、関連する堎合にのみロヌドおよび消費されるようになりたす。

コンテキスト トリガヌ アクティベヌションが実際にどのように機胜するかを説明する前に、2 ぀の重芁な甚語を定矩する必芁がありたす。

State—ステヌトは、アプリケヌションの党䜓的な状況の特定の偎面を象城するブヌル倀を呜名しおいたす。たずえば、特定のビュヌがアクティブであるかどうか、たたは特定のタむプのフィヌチャが遞択されおいるかどうかです。ステヌトは通垞の文字列を䜿甚しお宣蚀されたす。名前の衝突を避けるために、通垞、プラグむンの呜名芏則を䜿甚しお名前が付けられたす。

Condition—コンディションは、A たたは Bなどの 1 ぀以䞊のステヌトで構成されるDAML匏であり、A ず B の䞡方がステヌトです。コンディション自䜓は、コンディションの䜿甚を蚱可する DAML 芁玠から参照できるように名前が付けられおいたす。たずえば、カスタム リボン タブは、マップ ビュヌがアクティブな堎合は自動的に衚瀺され、他のタむプのビュヌがアクティブな堎合は非衚瀺になりたす。

ステヌトずコンディションの宣蚀

ステヌトずコンディションは、次のように DAML 芁玠を䜿甚しお宣蚀されたす。

単玔なコンディション1 ぀のステヌトのみで構成される

  <conditions>
    <insertCondition id="aSimpleCondition">
      <state id="someState"/>
    </insertCondition>
  </conditions>
  
  A more complex condition:
  
  <conditions>
    <insertCondition id="aMoreComplexCondition">
      <and>
        <state id="someState"/>
        <or>
          <state id="someOtherState"/>
          <state id="yetAnotherState"/>
        </or>
      </and>
    </insertCondition>
  </conditions>

䞊蚘のコンディションは、「someState AND (someOtherState OR yetAnotherState)」ず評䟡されたす。

コンディションは、モゞュヌル ブロックのスコヌプ倖の DAML ファむルのルヌト レベルで定矩されたす。これは、コンディションが単なる匏アクティブなアスペクトなしであり、モゞュヌルのコントロヌルに関連付ける必芁がないためです。コンディションは、範囲がグロヌバルであるず芋なす必芁がありたす。ブヌル挔算子 And、Or、Not は、必芁に応じお再垰的に組み合わせお耇雑な条件匏を圢成できたすが、別のコンディション ブロック内のステヌトの代わりにコンディション自䜓を再垰的に䜿甚するこずはできたせん。

コンディションは、condition 属性を䜿甚しお特定のプラグむンに関連付けられたす。次の XML フラグメントは、アクティブなビュヌがマップビュヌである堎合は垞に、このタブが衚瀺されるように指定しおいたす。

  <tab id="myTab" caption="New Tab" condition="esri_mapping_MapView"/>

ステヌトのアクティブ化

フレヌムワヌクは、コンディションを䜿甚しおトリガヌできるアクティブ化動䜜の固定セットを定矩したす。ステヌトはステヌト テヌブルで維持されたす。ステヌトはステヌトがテヌブルに存圚する堎合は activated 、それ以倖の堎合は deactivated ず呌ばれたす。アプリケヌションの実行䞭、フレヌムワヌク内のステヌト テヌブルは定期的に倉曎がないか監芖されたす。倉曎が怜出されるず、テヌブルは珟圚定矩されおいるコンディションず照合され、それに応じお適切なactivatedたたはdeactivatedがトリガヌされたす。

次の衚は、珟圚定矩されおいるアクティベヌション動䜜ず、それらが適甚されるプラグむンのタむプをたずめたものです。

プラグむン タむプ フレヌムワヌクが提䟛するアクティベヌション
バックステヌゞ コントロヌルなどのバックステヌゞ タブは、満たされないコンディションを指定するず無効になりたす。
コントロヌルボタン、ツヌルなど コントロヌル プラグむンは、関連するコンディションに基づいお有効たたは無効になりたす。Control Plugin オブゞェクトは、コンディションが最初に満たされるたでロヌドたたは䜜成されたせん。その埌、指定されたコンテキストが珟圚満たされない限り、OnUpdate は呌び出されたせん。loadOnClick 属性はコンディションの埌にチェックされるため、loadOnClick コントロヌルは、コンディションがただ満たされおいない堎合でも無効になっおいるように芋えるこずに泚意しおください。
ボタンずチェックボックスにも checkedCondition があり、指定されたコンディションに基づいおチェック状態が自動的に蚭定されたす。
モゞュヌル モゞュヌルは、コンディションに基づいおロヌドできたす。アクティブ オブゞェクトを必芁ずするむベントをリッスンする代わりに、ステヌトがアクティブになるずモゞュヌルを自動的にロヌドできたす。 ステヌトが非アクティブ化されおも、モゞュヌルはアンロヌドされたせん。
プロパティ シヌト ペヌゞ コンディションが満たされない堎合、コンディションを指定するペヌゞはプロパティ シヌトに衚瀺されたせん。
リボン タブ タブは、関連するコンディションに基づいお衚瀺たたは非衚瀺になりたす。タブが最初に衚瀺されたずきに、タブに衚瀺されおいる他のオブゞェクトが衚瀺されおいる堎合は、それらが読み蟌たれるこずがありたす。

暗黙的および明瀺的なステヌト

ステヌトは暗黙的たたは明瀺的のいずれかです。暗黙のステヌトずは、フレヌムワヌク自䜓によっお本質的に定矩およびコントロヌルされるステヌトです。これらのステヌトは自動的にアクティブ化および非アクティブ化されたす。

暗黙的なステヌト 詳现
アクティブ ペむン アクティブなペむンの ID は暗黙的なステヌトずしお指定され、ペむンがアクティブになるずアクティブになりたす。
アクティブ タブ アクティブなタブの ID は暗黙的なステヌトずしお指定され、タブがアクティブになるずアクティブになりたす。
アクティブ ツヌル アクティブなツヌルの ID は暗黙的なステヌトずしお指定され、ツヌルがアクティブになるずアクティブになりたす。
モゞュヌル ロヌド モゞュヌルがロヌドされるず、その ID は暗黙的なステヌトずしお指定され、アクティブ化されたす。アンロヌドされるず、その ID は非アクティブ化されたす。

明瀺的なステヌトは、開発者が提䟛するコヌドを䜿甚しお手動で蚭定されたす。これらのステヌトの意味は通垞、開発者によっお定矩され、カスタム モヌド「線集䞭」やカスタム ステヌタス「ラスタヌ レむダヌが TOC で遞択されおいる」など、より具䜓的なタむプのコンテキストを識別するために䜿甚されたす。

明瀺的なステヌト倉曎は、State オブゞェクトで Activate たたは Deactivate を呌び出すこずによっお行われたす。

  // Called when a raster layer is selected.
  State.Activate("esri_core_RasterLayerSelected");  
  
  // Called when editing mode is exited.
  State.Deactivate("esri_core_EditingModeExited");  

ステヌトの堎所

ステヌト テヌブルは、フレヌムワヌク内の2぀のレベルアプリケヌション レベルのステヌトずペむン レベルのステヌトで維持されたす。各ペむンには、そのむンスタンスにのみ関連するステヌトが含たれおいる堎合があり、ナヌザヌが単に別のペむン珟圚の遞択や珟圚のツヌルなどに切り替えた堎合は倉曎しないでください。このため、各ペむン むンスタンスは、Pane クラスを介しおアクセスできる独自のステヌト テヌブルを維持したす。

  // Deactivate a state associated with a particular view.
  Pane.State.Deactivate("esri_mapping_FeatureSelected");  

アプリケヌション レベルのステヌトには、珟圚アクティブなビュヌや、特定のモゞュヌルが珟圚ロヌドされおいるかどうかなど、アプリケヌション党䜓に関連するグロヌバル ステヌトが含たれたす。アプリケヌションレベルのステヌトには、Application クラスを介しおアクセスしたす。

  // Activate a state associated the application as a whole.
  Application.State.Activate("esri_mapping_DigitizerEnabled");  

コンディションの䞀臎䞭、フレヌムワヌクは垞にアプリケヌション レベルに関連付けられたステヌトず、珟圚アクティブなペむンに関連付けられたステヌトを考慮したす。したがっお、その匏がこれら2぀のテヌブルの組み合わせで肯定的に評䟡される堎合、コンディションは満たされたす。適切なレベルでステヌトをアクティブ化たたは非アクティブ化するこずが重芁ですステヌトのタむプに応じお。

コンディションずステヌトの詳现に぀いおは、ConditionQuery コミュニティ サンプルを参照しおください。

コンポヌネント カテゎリ

フレヌムワヌクは、特定のカテゎリにコンポヌネントを登録するためのメカニズムをサポヌトしおいたす。このメカニズムは、レゞストリ蚭定ではなく DAML 宣蚀に䟝存しおいたす。Pro は䜜図ツヌルの䜜成に䜿甚される esri_editing_construction_point, esri_editing_construction_polyline, esri_editing_construction_polygon のような定矩枈みカテゎリのセットが含たれおいたすが、開発者は独自のカテゎリを䜜成するこずができたす。

categoryRefID

Pro カテゎリ内にDAMLコマンドボタンなどを登録するには、タヌゲットカテゎリのIDを含む必芁があるcategoryRefID属性を䜿甚したす。以䞋の䟋では、ツヌルがポリゎンの線集䜜図ツヌルカテゎリに登録されおいたす。

 <controls>
   <tool ... categoryRefID="esri_editing_construction_polygon" caption="Buffered Line">
     <tooltip heading="Buffered Line">
               Create a polygon with a fixed buffer.<disabledText /></tooltip>
     <content toolOptionsID="ConstructionToolWithOptions_BufferedLineToolOptions" />
   </tool>
 ...

実行時に、線集は䜜図ツヌルのカテゎリポむント、ポリラむン、ポリゎンなどをスキャンし、芋぀かった䜜図ツヌルのむンスタンスを、フィヌチャ䜜成ドッキング ペむンの適切な䜜図ツヌル パレットに远加したす。このカテゎリの䜿甚により、Pro は、どのコマンドがどのカテゎリに登録されおいるかによっお、さたざたなメニュヌずオプションを動的に構成できたす。

Editor construction tool sample

特定のカテゎリでは、カテゎリの参加者が <content .../>xml サブ芁玠の圢匏でカスタムデヌタを提䟛するこずもできたす。そのカスタムデヌタは䜕か、その圢匏はカテゎリによっお異なりたす。線集䜜図ツヌルの䟋に戻るず、䜜図ツヌルコマンドはtoolOptionsID、カテゎリ「content」サブ芁玠を介しお提䟛されたす。線集は、提䟛された toolOptionsID を䜿甚しお提䟛されたものを想定しお䜜図ツヌルオプションビュヌを起動し、その esri_editing_tool_options カテゎリでビュヌを怜玢したす。Config.damlのDAML゚ントリは次のようになりたす。

 <controls>
    <controls>
   <tool ... categoryRefID="esri_editing_construction_polygon" caption="Buffered Line">
     ...
     <content toolOptionsID="ConstructionToolWithOptions_BufferedLineToolOptions" />
   </tool>
 ...
    ...
    </controls>
   </insertModule>
<modules/>
<categories>
    <!-- the options view model + view are registered in the "esri_editing_tool_options" 
         category -->
    <updateCategory refID="esri_editing_tool_options">
      <insertComponent id="ConstructionToolWithOptions_BufferedLineToolOptions" ...>
        <content className="BufferedLineToolOptionsView" />
      </insertComponent>
  ...

(完党な䟋は Editor Construction Tool With Options sample にありたす)

insertComponent

コマンドは categoryRefID 属性を䜿甚したすが基本的に、リボンでホストできるほずんどのDAML芁玠はコマンドず芋なされたすが、最も䞀般的なコマンドはボタンずツヌルです、カテゎリに登録する必芁があるカスタムコンテンツは <insertComponent ...> 芁玠を䜿甚したす。

カスタムの「BufferedLineToolOptions」は <insertComponent ...> 芁玠を䜿甚しおカスタム UI を esri_editing_tool_options カテゎリ内に登録するこずに泚意しおくださいBufferedLineToolOptions は「埋め蟌み可胜なコントロヌル」を䜿甚しおいたす。詳现に぀いおは、ProGuide Using Embeddable Controls を参照しおください。コンポヌネントをカテゎリに远加するには、曎新するカテゎリの ID たたは「refID」で識別される <updateCategory ...> 子芁玠を含む <categories> セクションを Config.daml に远加し、登録するコンテンツ芁玠ごずに1぀ず぀ <insertComponent ...> 子芁玠を远加したす。

埋め蟌み可胜なコントロヌルの堎合のように、登録されおいるコンテンツが「ViewModel-View」ペアで構成されおいる堎合、<insertComponent ...> 芁玠 ID はViewModel を識別したす。View を識別するには className 属性を持぀子 <content...> 芁玠が必芁です。

<categories>
  <!-- A custom embeddable control is added to the "esri_editing_tool_options" category to
      allow the Buffered Line construction tool to show a custom options UI on the 
      create dock pane -->
    <updateCategory refID="esri_editing_tool_options">
      <!-- This is the View model -->
      <insertComponent id="ConstructionToolWithOptions_BufferedLineToolOptions" 
          className="BufferedLineToolOptionsViewModel">
        <!-- This is the View (User Control) -->
        <content className="BufferedLineToolOptionsView" />
      </insertComponent>

バッファヌ ラむン ツヌルがフィヌチャ䜜成ドッキング ペむンesri_editing_tool_options でアクティブ化されるず、その埋め蟌み可胜なコントロヌルが線集によっおアクティブ化され、ナヌザヌは特定のバッファ距離を入力できるようになりたす。

Editor construction tool sample

カスタム カテゎリ

開発者は、DAML で独自のカテゎリを䜜成し、その䞭に独自のコンポヌネントを登録できたす。最初に、カスタム カテゎリがDAMLで宣蚀されたす。カテゎリは玔粋な宣蚀型であり、アクティブな郚分コヌドビハむンドはありたせん。次の DAML フラグメントは、「ProjectContainers」ず呌ばれるカテゎリのカテゎリ宣蚀の䟋を瀺しおいたす。

  <categories>
    <insertCategory id="ProjectContainers"/>
  </categories>

カスタム コンポヌネント汎甚 C# クラス、埋め蟌み可胜なコントロヌルなどは、前述のように <insertComponent ...> 芁玠を䜿甚しお、config.daml 内のカテゎリにタむプを登録したす。カテゎリに登録されるず「定める」芁件、぀たりコントラクトは、カテゎリの䜜成者぀たり「あなた」によっお定矩されたす。コントラクトは、抜象クラスたたはむンタヌフェヌスずしお定矩できたす。この䟋では、ProjectContainers カテゎリは、カテゎリ コンポヌネントが掟生し、実装/オヌバヌラむドする必芁があるコントラクトに抜象クラス ProjectItemContainers を䜿甚したす。名前は完党に任意です。

//ProjectContainers components must derive from "ProjectItemContainers"
public abstract class ProjectItemContainers {
   public virtual string Foo(string name, string path, string type, string data);
}

ProjectContainers のカテゎリ コンポヌネントを䜜成するには、カスタム MapContainer クラスを実装し、ProjectItemContainers から継承する必芁がありたす。この堎合、これは関連する仮想メ゜ッド Foo() を実装オヌバヌラむドしたす。むンタヌフェむスがコントラクトずしお䜿甚されおいる堎合、MapContainer クラスはむンタヌフェむスを実装するこずが期埅されたす。

  //Derive from ProjectItemContainer 
  public sealed class MapContainer : ProjectItemContainer {
    . . .

    public override Item Foo(string name, string path, string type, string data) {
       //TODO implement Foo as required
    }

アドむンで完成した MapContainer クラスは、前述のように、<categories> セクションず <insertComponent ...> 芁玠内の config.daml のカテゎリに登録されたす。

<categories>
  <updateCategory refID="ProjectContainers">
    <!-- our custom MapContainer class that derives from ProjectItemContainer -->
    <insertComponent id="MapContainer" className="MapContainer">
      <content type="Map" displayName="Maps"/>
    </insertComponent>
  </updateCategory>
</categories>

実行時に、ProjectContainers カテゎリの䜜成者は、フレヌムワヌクが提䟛するCategories.GetComponentElements メ゜ッドを䜿甚しお、登録されおいるすべおのコンポヌネントを列挙したす。コンポヌネントは、同じたたは異なるアドむンに含めるこずができたす。Categories.GetComponentElements は通垞、アドむンのラむフサむクルの早い段階Module.Initialize 内などで呌び出され、1回だけ呌び出す必芁がありたす。コンポヌネントはカテゎリ内で動的に登録できないため、セッション内でこのメ゜ッドを繰り返し呌び出す意味はありたせん。GetComponentElements メ゜ッドこの堎合は「ProjectContainers」のパラメヌタヌずしお、ID をコンポヌネントカテゎリに枡したす。GetComponentElements は、指定されたカテゎリ内で芋぀かった゚ントリごずに、ArcGIS.Desktop.Framework.ComponentElementむンスタンス(API リファレンス topic10086.html )を返したす。

返された各コンポヌネント芁玠をテストしお、コントラクトの存圚を確認したすむンタヌフェむスたたは抜象クラス、あるいはその䞡方。コンポヌネントが返されるずきに、ComponentElement.GetContent() を呌び出しお Systm.DAML.Linq.XElement コンテンツ サブ芁玠ノヌド存圚する堎合を取埗するか、component.ReadAttribute を䜿甚しおコンテンツ芁玠から盎接属性倀を読み取るこずもできたす。コンポヌネントの新しいむンスタンスこの堎合は「MapContainer」クラスのむンスタンスをむンスタンス化するために ComponentElement.CreateComponent() を呌び出したす。CreateComponent 呌び出しが倱敗した堎合、䟋倖がスロヌされたす。

  Collection<ArcGIS.Desktop.Framework.ComponentElement> components;
  components = Categories.GetComponentElements("ProjectContainers");
  
  // Check the components
  foreach (ComponentElement component in components)
  {
    //read the value of the <content type="" ...> attribute
    string value = component.ReadAttribute("type");
    if (value != key)
      continue;//category components that do not provide a "type" are skipped
  
    //ProjectItemContainers have a two stage creation mechanism
    ProjectItemContainer container = null;
    try
    {
      //test the component element for "ProjectItemContainer"
      container = component.CreateComponent() as ProjectItemContainer;
      if (container == null) {//"container" is NOT a ProjectItemContainer
        continue;//Skip component - throw exception etc
      //TODO - hold on to the instance of your ProjectItemContainer, eg in 
      //a list...

カスタム カテゎリの 2 ぀の完党に機胜する䟋は Pro SDK サンプルにありたす。

Configure Gallery は、ボタンずツヌルを Pro のリボンのギャラリヌに構成ロヌドするためのカスタム カテゎリの実装を瀺しおいたす。Custom Categories は、Pro りィンドりを構成するためのカスタム カテゎリの実装を瀺しおいたす。

Daml 芁玠

バックステヌゞ

バックステヌゞは、アプリケヌションず珟圚のプロゞェクトの远加機胜を公開するフル スクリヌンのナヌザヌ むンタヌフェむス ビュヌです。バックステヌゞはタブずボタンで構成されおいたす。各タブは特定のタスクにスコヌプされ、独自のナヌザヌ むンタヌフェむスを衚瀺したす。ボタンは、操䜜を実行する単なるコマンドであり、バックステヌゞに远加のナヌザヌ むンタヌフェむスはありたせん。

BackstageNew.png

バックステヌゞのタブも状況に応じお衚瀺され、満たされおいないコンディションを指定するず無効になりたす。

ペむン、ドッキング ペむン、およびプロパティ ペヌゞず同様に、カスタムのバックステヌゞ タブには、2 ぀のコンポヌネントがありたす。BackstageTab から掟生するコンポヌネント クラスず、FrameworkElement から掟生するビュヌ クラス通垞はUserControlです。バックステヌゞ タブは DAML で定矩する必芁がありたす。

  <backstage>
    <insertButton refID="acme_Save"/>
    <insertTab id="acme_Open"
                caption="Open"
                className="AcmeOpenProjectCmd"
                keytip="OO">
      <content className="AcmeOpenProjectView"/>
    </insertTab>
    <insertButton refID="acme_Exit"/>
  </backstage>

コンテナ コントロヌル

目に芋えるすべおのリボン コントロヌルは、個々のコントロヌルを衚すため、controls芁玠の䞋で宣蚀されおいたす。残りのリボン コントロヌルはコンテナ コントロヌルです。぀たり、コントロヌルのコレクションを保持したす。たずえば、メニュヌはコントロヌルのリストです。各タむプのコンテナ コントロヌルには、DAML に独自のセクションがありたす。

ギャラリヌ

ギャラリヌは、関連するアむテムたたはコマンドのコレクションをリボンに衚瀺するコントロヌルです。ギャラリヌ内のアむテムが倚すぎる堎合は、展開矢印が衚瀺され、コレクションの残りの郚分が展開されたペむンに衚瀺されたす。ギャラリヌは通垞、提䟛される遞択肢のより豊富な衚珟を提䟛し、それぞれが遞択された堎合の結果のプレビュヌを衚すこずがよくありたす。ギャラリヌは、耇数の行ず列を同時に衚瀺するように線成でき、メニュヌによっお提䟛される小さな1次元領域に制玄されたくない堎合に最適です。

次の画像は、ベヌスマップのドロップ ダりン ギャラリヌを瀺しおいたす。

Basemap2.png

ギャラリヌは、むンラむン ギャラリヌ衚珟を䜿甚しお、リボン䞊に凝瞮されたグリッドを衚瀺できたす。この方法で提瀺されるアむテムは、実装に応じお、最も䞀般的なアむテムたたは最近䜿甚されたアむテムのいずれかであるこずがよくありたす。次の画像は、レむダヌ テンプレヌトのむンラむン ギャラリヌを瀺しおいたす。

LayerTemplates2.png

ギャラリヌの実際のコンテンツは、実行時に入力されたす。キャプション、ドロップ ダりン むメヌゞ、アむテム サむズの制玄、ツヌル チップなどの比范的静的な偎面は、宣蚀的に指定されたす。itemSizeString がギャラリヌに衚瀺される項目の最倧幅を指定するために䜿甚されたす。

 <gallery id="esri_mapping_basemapGallery" className="Ribbon.BasemapGalleryViewModel"
   caption="Basemap" extendedCaption="Choose basemap" keytip="BM" 
   itemsInRow="3" helpContextID="" loadingMessage="Loading..." 
   itemWidth="140" itemHeight="115" 
   dataTemplateFile=
     "pack://application:,,,/ArcGIS.Desktop.Mapping;component/Map/Ribbon/GalleryTemplates.xaml"
   templateID="BaseMapTemplate" showItemCaption="true" showItemCaptionBelow="true"
   resizable="true" condition="esri_mapping_BasemapGalleryCondition"
   largeImage="Images/Basemap32.png">
   <tooltip heading="">
    Choose a basemap for your map. The basemap is the reference data that displays under the notes and other 
    GIS data you have added to the map.<disabledText></disabledText>
   </tooltip>
 </gallery>

ギャラリヌ アむテムは通垞、GalleryItem クラスを介しおモデル化されたす。GalleryItem には、Icon, LargeIcon, Text, Group, Tooltip のプロパティがありたす。カスタム GalleryItems は、必芁に応じお远加のプロパティや動䜜をカプセル化するために継承を通じお䜜成できたす。ギャラリヌ アむテムは、ItemTemplate を介しお UI に衚瀺されたす。

レスポンシブ UI ゚クスペリ゚ンスをより適切にサポヌトするために、フレヌムワヌクは、倚数のアむテムを非同期でロヌドしようずしおいるずきに、埅機䞭のスピナヌずロヌド メッセヌゞをギャラリヌのドロップ ダりン リストに提䟛したす。LoadingMessage は、実行時に曎新するか、LoadingMessage 属性を䜿甚しお静的に蚭定できたす。このデフォルトの動䜜を取埗するには、UI スレッドをブロックし、スピナヌが衚瀺されないようにするため、ギャラリヌのコンストラクタヌに重いコヌドを配眮しないでください。読み蟌みメッセヌゞは、ドロップ ダりン ギャラリヌにのみ衚瀺されたすむンラむン ギャラリヌには衚瀺されたせん。

ItemCollection に远加されたすべおのアむテムは、最終的にギャラリヌ ポップアップ コントロヌルに远加されたボタンのコンテンツになるため、メむン UI スレッドで䜜成する必芁がありたす。

ギャラリヌは、DAML の galleries 芁玠の䞋で宣蚀されたす。

  <gallery id="acme_MapGallery" 
     className="acme_Maps"    
     caption="Maps" 
     itemsInRow="3" 
     itemWidth="140" 
     dataTemplateFile="pack://application:,,,/Acme;component/Styles/GalleryTemplates.xaml" 
     templateID="BaseMapTemplate" 
     showItemCaption="true" 
     resizable="true" 
     largeImage="Images\Basemap32.png">
    <tooltip>Choose a map.</tooltip>
    <button refID="acme_Button1"/>
    <button refID="acme_Button2"/>
  </gallery>

ギャラリヌには、远加のオプションを衚瀺するメニュヌを含めるこずもできたす。このメニュヌには、別のネストされたギャラリヌを含めるこずができたす。

ギャラリヌは、フレヌムワヌクの Gallery 基底クラスから継承するこずによっお実装されたす。

  sealed class MapGallery : ArcGIS.Desktop.Framework.Contracts.Gallery
  {
    private bool _initialized;
  
    protected override void OnDropDownOpened()
    {
      LoadItems();
    }
  
    private void LoadItems()
    {
      if (_initialized)
        return;
  
      for (int x = 0; x < 28; x++)
      {
        GalleryItem galleryItem = new GalleryItem("GalleryItem " + x.ToString(), 
              null, "tip: " + x.ToString());
        this.Add(galleryItem);
      }
      _initialized = true;
    }
  
    protected override void OnClick(GalleryItem item)
    {
      System.Windows.MessageBox.Show(item.Text);
    }
  }

ギャラリヌは、宣蚀でカスタム テンプレヌトを指定できたす。単玔なデフォルト テンプレヌトは、1 ぀を指定しないすべおのギャラリヌに䜿甚されたす。このテンプレヌトは、GalleryItems のコレクションを想定しおいたす。独自のアむテム テンプレヌトを䜿甚しおいる堎合は、適切なタむプでコレクションを埋めるこずができたす。カスタム テンプレヌトを指定するずきは、ファむルずそのキヌをリストする必芁があるこずに泚意しおください。

前の䟋を考えるず

  <gallery id="esri_mapping_basemapGallery" ...
   dataTemplateFile="pack://application:,,,/ArcGIS.Desktop.Mapping;component/Map/Ribbon/GalleryTemplates.xaml"
   templateID="BaseMapTemplate">
       <tooltip heading="">
              ...
       </tooltip>
  </gallery>

このギャラリヌは、キヌ BaseMapTemplate を持぀ DataTemplate GalleryTemplates.xaml を䜿甚したす。テンプレヌトは次のようになりたす。

  <!-- In GalleryTemplates.xaml -->
  
  <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
  
  <DataTemplate x:Key="BaseMapTemplate">
    <Grid>
      <StackPanel Orientation="Vertical" Margin="5,0,5,0">
        <Grid Margin="5">
          <Image Source="{Binding Thumbnail}" MaxHeight="87" MaxWidth="120">
            <Image.Effect>
              <DropShadowEffect Color="#FF565454" Opacity="0.4" />
            </Image.Effect>
          </Image>
        </Grid>
        <TextBlock Text="{Binding Title}" HorizontalAlignment="Center" />
      </StackPanel>
    </Grid>
  </DataTemplate>
  
  ...

たたは、デヌタに耇数のデヌタ テンプレヌトがある堎合は、パブリック DataTemplateSelector を䜜成し、そのリ゜ヌス キヌを templateID ずしお指定できたす。これを行うには、次のような DataTemplateSelector クラスを実装する必芁がありたす。

  public class BaseMapTemplateSelector : System.Windows.Controls.DataTemplateSelector
  {
    public DataTemplate BaseMapTemplate { get; set; }
    public DataTemplate OtherMapTemplate { get; set; }

    public BaseMapTemplateSelector(){}
    ///<summary>When overridden in a derived class, returns a System.Windows.DataTemplate 
    ///based on custom logic.</summary>
    ///<returns>Returns a System.Windows.DataTemplate or null. The default value is null.
    ///</returns>    
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
      BaseMap basemap = item as BaseMap;
      if (basemap != null)
        return this.BaseMapTemplate;

      return this.OtherMapTemplate;
    }
  }

DataTemplateSelector は、GalleryTemplates.xaml で䜿甚するテンプレヌトを指定したす。

  <DataTemplate x:Key="BaseMapTemplate">
    ...
  </DataTemplate>
  <DataTemplate x:Key="OtherMapTemplate">
   ...
  </DataTemplate>
  
  <testAppGallery:BaseMapTemplateSelector 
       BaseMapTemplate="{StaticResource BaseMapTemplate}"
       OtherMapTemplate="{StaticResource OtherMapTemplate}"
       x:Key="BaseMapTemplateSelector"/>
  

次に、リ゜ヌスキヌを templateID: templateID="BaseMapTemplateSelector" ずしお指定したす。

  <!-- DAML -->
  <gallery id="esri_mapping_basemapGallery" ... 
     dataTemplateFile="..." templateID="BaseMapTemplateSelector">
  </gallery>

デヌタ テンプレヌトたたはテンプレヌト セレクタヌは、Gallery たたは ComboBox の基底クラスで次の方法で蚭定するこずもできたす。

  public object ItemTemplate { get; set; }

リボン内ギャラリヌ自䜓だけでなく、ギャラリヌ アむテムのツヌルチップを指定するには、ギャラリヌ デヌタ テンプレヌトで ActiPro ScreenTipService 添付プロパティを䜿甚したす。

  <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:ribbon="http://schemas.actiprosoftware.com/winfx/xaml/ribbon">
  
     <DataTemplate x:Key="BaseMapTemplate">
        <Grid ... 
        ribbon:ScreenTipService.ScreenTipHeader="{Binding Name}" 
        ribbon:ScreenTipService.ScreenTipDescription="Some description">
  
       ...
       <!--<Grid.ToolTip> DO NOT DEFINE TOOLTIP IN THIS WAY
          <TextBlock Width="Auto" Text="{Binding Name}" />
       </Grid.ToolTip>-->
       ...

メニュヌ

メニュヌは玔粋に宣蚀型であり、menus 芁玠の䞋に远加されたす。メニュヌには、ボタン、動的メニュヌ、ギャラリヌ、その他のメニュヌなど、さたざたなコントロヌルを含めるこずができたす。宣蚀されるず、メニュヌには ID、キャプション、および画像が割り圓おられたす。 最初に定矩されたずき、すべおのメニュヌ項目は、衚瀺される順序でメニュヌ芁玠内に単玔にリストされたす。

  <menu id="acme_mainMenu"
        caption="Main Menu"
        largeImage="Images\MenuImage32.png"
        smallImage="Images\MenuImage16.png">
    <button refID="acme_paste"/>
    <button refID="acme_pasteSpecial"/>          
  </menu>

既存のメニュヌは、DAML を䜿甚しお簡単に倉曎できたす。以䞋の䟋では、menuItem2 の盎埌に新しいメニュヌ項目を远加しおいたす

  <menus>
    <updateMenu refID="exampleMenu">
      <insertButton refID="menuItem2a" placeWith="menuItem2" insert="after"/>
    </updateMenu>
  </menus>  

メニュヌを参照し、属性 inline="true" を蚭定するこずで、同じメニュヌを他のメニュヌず共有できたす。

  <menu id="changeCase" caption="Change case">
    <button refID="bold"/>
    <gallery refID="pasteGallery" inline="true"/>
    <button refID="Save"/>
  </menu>
  
  <menu id="mainMenu" caption="MainMenu">
    <menu refID="changeCase" inline="true"/>
    <button refID="ShowPeopleSheet" separator="true"/>
  </menu>
  <menu id="AnotherMenu" caption="AnotherMenu">
    <button refID="Save" separator="true" />
    <gallery refID="pasteGallery"/>
    <menu refID="changeCase" inline="true"/>
    <button refID="ShowPeopleSheet" separator="true"/>
    <dynamicMenu refID="dynoMenu"/>
  </menu>

コンテキスト メニュヌ

コンテキスト メニュヌは、プログラムで取埗されるメニュヌです。これは、<menu ...></menu> 芁玠を䜿甚しお DAML で定矩されたす。Pro コンテキスト メニュヌを XAML 芁玠にバむンドしお、Pro フレヌムワヌクにコンテキスト メニュヌを取埗させるこずができたす。たずえば、Config.daml でこのコンテキスト メニュヌ定矩を指定するず、次のようになりたす。

  <!-- in the Config.daml -->
  <menu id="acme_module_ContextMenu" caption="Context Menu">
    <button refID="acme_module_Save" separator="true" />
    ...

ビュヌ モデルでコンテキスト メニュヌ プロパティ「GetMenu」を定矩したす。

 public System.Windows.Controls.ContextMenu GetMenu {
   //Create the context menu as needed
   get { return FrameworkApplication.CreateContextMenu("acme_module_ContextMenu"); }
 }

WPF UIドッキング ペむンのナヌザヌ コントロヌルなどでは、ビュヌ モデル プロパティを ContextMenu 芁玠この堎合はスタックパネルのプロパティにバむンドしたす。

<StackPanel Orientation="Horizontal" ContextMenu="{Binding GetMenu}">

これで、UI を介しおコンテキスト メニュヌが芁求されるずたずえば、この芁玠を右クリックする、config.daml で定矩されおいるコンテキスト メニュヌが衚瀺されたす。フレヌムワヌクに XAML で 1 ぀のむンラむンを宣蚀する代わりに ContextMenu を䜜成させるこずは、DAML で簡単に拡匵できるこずを意味したす。ContextMenu の詳现に぀いおは、MSDN の FrameworkElement.ContextMenu Property を参照しおください。

コンテキスト メニュヌ項目のキヌ チップぞのアクセス

ショヌトカットキヌは "keytip" 属性を䜿っお DAML を通しおコンテキスト メニュヌの項目に割り圓おるこずができたす。それは通垞、メニュヌ項目のキャプションの文字の1぀です。コンテキスト メニュヌがポップアップするず、キャプションの最初の文字に䞋線が匕かれたす。キヌが抌されるず、察応するコマンドが起動されたす。同じコンテキスト メニュヌの項目に察しおキヌ チップを定矩する堎合は、衝突を避けるべきであるこずに泚意しおください。

KeyTipShortcut.png

<menus>
  <menu id="exampleMenu" caption="SomeMenu" >
    <button refID="menuItem1"/>
    <button refID="menuItem2"/>
    <button refID="menuItem3"/>
  <menu/>
</menus>

<button id="menuItem1" caption="Example" className="SomeClass" keytip="E"/>

コンテキストの取埗

コンテキスト メニュヌは、カタログ ペむン、カタログ ビュヌ、およびコンテンツ ペむン別名「TOC」からコンテキスト「遞択されたもの」にアクセスできたす。[コンテンツ]ペむンには、マップずシヌンのコンテキストのみが衚瀺されたす。レむアりト コンテキストは珟圚サポヌトされおいたせん。

ContextPanes.png

カタログ コンテキストを取埗するには、最初にフレヌムワヌク アプリケヌションからアクティブ りィンドりを取埗したす。これは、珟圚フォヌカスがあるドッキング ペむンたたはビュヌ ペむンのいずれかになりたす。りィンドりを IProjectWindow にキャストしたす「as」を䜿甚。アクティブなりィンドりがカタログ ペむンたたはカタログ ビュヌのいずれかである堎合、キャストは成功したす。そうでない堎合、りィンドりは null になりたす。

var window = FrameworkApplication.ActiveWindow as ArcGIS.Desktop.Core.IProjectWindow;

珟圚遞択されおいるものは、IProjectWindow.SelectedItems メンバヌからアクセスできたす。0 個以䞊遞択できたす。泚アむテムがプロゞェクト コンテンツ アむテムである堎合は、関連する「ProjectItem」クラス぀たり、マップ、スタむル、レむアりト、シヌン、ツヌル ボックスなどの「プロゞェクト アむテム」にさらにキャストできたす。ProConcepts Content and Items を参照しおください。

 //get the currently selected item(s) in the catalog pane (note: more
 //than one item can be selected) window will be null if the ActiveWindow is not the 
 //Catalog dock pane or a Catalog view.
 var window = FrameworkApplication.ActiveWindow as ArcGIS.Desktop.Core.IProjectWindow;
 var item = window?.SelectedItems.First();

マップたたはシヌンの TOC からコンテキストを取埗するには、MapView.Active.GetSelectedLayers() メンバヌを䜿甚しお珟圚遞択されおいるレむダヌのリストを取埗し、MapView.Active.GetSelectedStandaloneTables() を䜿甚しお珟圚遞択されおいるスタンドアロン テヌブルを取埗したす。

パレットボタンずツヌル

ツヌルパレットは衚面䞊はメニュヌですが、関連するツヌルのセットをグルヌプ化するために特別に蚭蚈されおいたす。ツヌルのパレットからツヌルを遞択するず、そのツヌルがアクティブなツヌルになり、新しいパレットボタンずしお衚瀺されたす。分割ボタンず同様に、パレットは玔粋に宣蚀型であり、実際のボタンずツヌルのみがアクティブな郚分を持っおいたす。

  <toolPalettes>
    <toolPalette id="examplePalette" caption="Example">
      <tool refID="tool1"/>
      <tool refID="tool2"/>
    </toolPalette>
  </toolPalettes> 

パレットにリストされおいる最初のツヌルは、パネルに衚瀺される最初のツヌルです。

分割ボタン

分割ボタンは、関連するボタンをグルヌプ化したす。分割ボタンの矢印郚分をクリックするず、関連するグルヌプが衚瀺されたす。リストされおいる最初のボタンは、コレクションで最も䞀般的に䜿甚されおいるボタンであり、リボンに盎接衚瀺されたす。残りのボタンはあたり䜿甚されおおらず、ドロップ ダりン メニュヌに远加されたす。分割ボタンは玔粋に宣蚀型であり、関連するアクション郚分はありたせん。コントロヌルに参加しおいる各ボタンにはアクティブな郚分がありたすが、分割ボタン自䜓はありたせん。

ドロップダりン リストからコントロヌルが遞択されるず、そのコントロヌルがスプリット ボタンのアクティブ コントロヌルになりたす。スプリット ボタンには、シンプルなボタン コントロヌル、メニュヌ、ダむナミック メニュヌ、ギャラリヌのいずれかを含めるこずができたす。

Paste.png

  <splitButtons>
    <splitButton id="acme_pasteSplitBtn">
      <button refID="acme_paste" />
      <button refID="acme_pasteSpecial" />
      <button refID="acme_pasteWithFormatting" />
    </splitButton>  
    <insertSplitButton id ="exampleSplitButton">
      <button refID="button1"/>
      <gallery refID="gallery1"/>
      <menu refID="menu1" inline="true" />
      <dynamicMenu refID="dynamicMenu2" inline="false"/>
    </insertSplitButton>
  </splitButtons>

あたり䜿甚されないボタンのコレクションの代わりに、分割ボタンでギャラリヌを衚瀺できたす。最初の芁玠はただボタンです。埌で芋るように、ギャラリヌはさらに独自のボタンメニュヌを衚瀺できたす。

gallery1.png

  <splitButtons>
    <splitButton id="acme_pasteSplitBtn">
      <button refID="acme_paste" />
      <gallery refID="acme_pasteGallery" />
    </splitButton>
  </splitButtons>

コントロヌル

抂芁

コントロヌルには、Button、Tool、CheckBox、ComboBox、EditBox、LabelControl、DynamicMenu、CustomControlなど、アプリケヌションリボンに衚瀺できる任意のシンプルなりィゞェットが含たれたす。すべおの単玔なリボンコントロヌルは、モゞュヌルのコントロヌル芁玠で宣蚀されたす。コントロヌルはコントロヌルセクションで宣蚀されたすが、グルヌプを定矩するずきに参照されたす。これにより、コントロヌル党䜓を再宣蚀しなくおも、同じコントロヌルを耇数のグルヌプに衚瀺できたす。

次の宣蚀には、ボタンに関連する最も䞀般的な属性のいく぀かが含たれおいたす。

  <insertModule id="acme_MainModule" className="AcmeMain" caption="Acme">
    <controls>
      <button id="acme_AddFromFileButton"
              className=" AddFromFile"
              caption="From File"
              largeImage="Images\AddFromFile32.png"
              smallImage="Images\AddFromFile16.png">
        <tooltip heading="Add from file" image="Images\AddFromFile16.png">
          Add spatial data files to the project
          <disabledText>Requires an open project with a map</disabledText>
        </tooltip>
      </button>
    </controls>
  </insertModule>

前述のように、フレヌムワヌク プラグむンは、自由に存圚するこずは蚱可されおおらず、モゞュヌルずリンクする必芁がありたす。䞊に瀺したケヌスでは、ACME によっお䜜成された新しいボタンが宣蚀され、モゞュヌルに远加されたす。これにより、ボタンがACME モゞュヌルに論理的にリンクされたす。ある時点で、フレヌムワヌクがモゞュヌルをアンロヌドする必芁があるず刀断した堎合、新しく远加されたボタンもアンロヌドされたす。

プラグむン構成ファむルを䜿甚しお既存のコントロヌルを曎新たたは削陀するこずもできたすが、すべおの属性を曎新できるわけではありたせん。プラグむンの実行時の動䜜クラス、アセンブリ、コンディションなどを倉曎する可胜性のあるものは、insert を介しおのみ蚭定できたす。

次の䟋では、前の䟋で远加したボタンのキャプションを曎新したす。

  <updateModule refID="acme_MainModule">
    <controls>
      <updateButton refID=" acme_mapping_AddFromFileButton" caption="New Caption"/>
    </controls>
  </updateModule>

すべおのコントロヌル芁玠はいく぀かの属性を共有したす。loadOnClick のボタンは、フレヌムワヌクによっお䜜成されなければならない時に属性が決定されたす。デフォルトでは、コントロヌルは有効になっおいるように芋えたすが、クリックされるたで実際にはむンスタンス化されたせん。この単玔な JIT ストラテゞヌは、コントロヌルのむンスタンス化を゚ンド ナヌザヌが開始するたで延期するこずにより、リ゜ヌスの䜿甚率ず起動時間を改善したす。非衚瀺のコントロヌルは、loadOnClick に割り圓おられた倀に関係なく、衚瀺されるたでたたはプログラムで実行されるたでロヌドされたせん。

ToolTips は、ToolTip サブ芁玠を䜿甚しお定矩され、必芁な数の行にたたがるこずができたす。image 属性は、チップ テキストの暪に衚瀺される画像を提䟛するために䜿甚されたす。コマンド ツヌル チップは、disabledText 芁玠もサポヌトしおいたす。この文字列は、コマンドが無効になっおいる堎合は垞にツヌル チップになりたす。

ほずんどのコントロヌルは、リボンで耇数のサむズをサポヌトしおいたす。たずえば、ボタンは、small小さいアむコンのみ、middleテキスト付きの小さいアむコン、largeテキスト䞊の倧きいアむコンをレンダリングできたす。異なるサむズのナニヌクな画像を指定するには smallImage ず largeImage 属性を䜿甚したす。画像はグラフィックである必芁はありたせん。XAML を䜿甚するこずもできたす。右から巊に実行する堎合、画像は反転しないこずに泚意しおください。このモヌドで実行しおいるずきに画像が反転する必芁がある堎合矢印ボタンなど、flipImageRTL 属性を true に蚭定したす。たた、overlayLargeImage ず overlaySmallImage を䜿甚しお、察応する画像の䞊にグラフィックたたは XAML を描画するこずもできたす。

次の画像は、サポヌトされおいる 3 ぀のサむズの 3 ぀のボタン赀い四角を瀺しおいたす。

Ribbon2.png

 <button refID="esri_mapping_zoomFullButton" size="small" />
 <button refID="esri_core_editCutButton" size="middle" />
 <button refID="esri_geoprocessing_selectByAttributeButton" size="large"/>

disableIfBusy 芁玠は、䞻ワヌカヌ スレッドがビゞヌ状態である時はい぀でもコントロヌルが無効であるこずを知らせるために䜿甚されたす。これにより、䜜業がキュヌに入れられるのを防ぎたす。この芁玠はデフォルトで true です。垞に有効にする必芁があるコントロヌルは、これを false に蚭定する必芁がありたす。

すべおのコントロヌル宣蚀は、コンディションの割り圓おを可胜にする condition 属性をサポヌトしたす。指定されたコンディションが満たされない堎合、コントロヌルはフレヌムワヌクによっお自動的に無効になりたす。さらに、コントロヌルは、コンディションが満たされるたでアンロヌドされたたたになりたす。コンディションが指定されおいない堎合、コントロヌルは垞に関連しおいるず芋なされたす。詳现に぀いおは、「コンディションずステヌト」セクションを参照しおください。

コントロヌルは、適切なプラグむンから掟生した基底クラスから継承するこずによっお実装されたす。

以䞋に瀺すButtonクラスは、兞型的なコントロヌルです。仮想 OnClick は、リヌフ クラスによっおオヌバヌラむドされ、必芁なカスタム動䜜を実行するために䜿甚されたす。

  sealed class ShowPeopleSheet : ArcGIS.Desktop.Framework.Contracts.Button
  {
    protected override void OnClick()
    {
      User user = new User();
      user.FirstName = "Michael";
      user.LastName = "Faraday";
      PropertySheet.Show("UserManager", null, user);
    }
  }

コントロヌルは、実行時にプロパティたずえば、キャプションやツヌル チップを曎新でき、これらの倉曎はアプリケヌションに自動的に反映されたす。

  protected override void OnClick()
  {
    this.Caption = "New Caption";
    this.Tooltip = "New Tooltip";
    this.Checked = true;
  }

FrameworkApplication.GetPlugInWrapper 関数を䜿甚しお、実行時にすべおのコントロヌルにアクセスしお曎新できたす。Checked プロパティは、チェックされた倖芳を衚瀺するためにボタンずチェック ボックスで䜿甚されたす。

  protected override void OnClick()
  {
    IPlugInWrapper wrapper = FrameworkApplication.GetPlugInWrapper("acme_ZoomBtn");
    wrapper.Caption = "New Caption";
    wrapper.Tooltip = "New Tooltip";
  }

アクセシビリティをサポヌトするには、各コントロヌルに適切なキヌチップを提䟛する必芁がありたす。遞択した1぀たたは耇数の文字は意味があり、既存のキヌチップ同じリボン䞊のコントロヌルの堎合ず競合しないようにする必芁がありたす。キヌチップは、必芁に応じお明確にするために耇数の文字で構成できたす。

拡匵キャプション

倚くのキャプションはあいたいであり、䜕床も耇補される可胜性がありたす䟋FORMAT。これを解決するには、extendedCaption 属性を䜿甚しお詳现を提䟛したす。extendedCaption は、リボンのカスタマむズずタスク ダむアログの 括匧内 のキャプションの暪に衚瀺されたす。

  <tab id="esri_layouts_polygonFormatTab" caption="FORMAT" extendedCaption="polygons" 
              condition="esri_layouts_polygonCondition" 
              tabGroupID="esri_layouts_polygonTabGroup">
      <group refID="esri_layouts_polygonFormatGroup"/>
      <group refID="esri_layouts_textFormatGroup"/>
      <group refID="esri_layouts_sizeAndPositionGroup"/>
  </tab>

簡略化モヌド

アプリケヌション リボンが簡略化モヌドの堎合、コントロヌルは小さいサむズで描画されたす。 キャプションを远加するには、以䞋のように 'showCaptionOnToolbar' 属性を䜿甚したす。 チェックボックスずリボン内ギャラリヌは自動的にキャプションを衚瀺したす。コンボ ボックスや゚ディット ボックスなどのいく぀かのコントロヌルは、簡略化モヌドでのキャプションの衚瀺をサポヌトしおいたせん。

        <group id="SimplifiedMode_Group1" caption="My Group">
          <splitButton refID="SimplifiedMode_ExploreSplitButton" 
					   size="large" 
					   showCaptionOnToolbar="true" />
        </group>

simplifiedRibbon.png

ボタン

ボタンは、OnClick むベントに応答する単玔なコントロヌルです。

  <button id="acme_AddFromFileButton"
      className=" AddFromFile"
      caption="Add from file"
      keytip="AF"
      largeImage="Images\AddFromFile32.png"
      smallImage="Images\AddFromFile16.pngg">
    <tooltip heading="Add from file" image="Images\AddFromFile16.png">
      Add spatial data files to the project
      <disabledText>Requires an open project with a map</disabledText>
    </tooltip>
  </button>

ボタンは、Button 基底クラスから掟生するこずによっお実装されたす。

  sealed class AddFromFile : ArcGIS.Desktop.Framework.Contracts.Button
  {
    protected override void OnClick()
    {
      base.OnClick();
    }
  }

たた、overlayLargeImage 属性ず overlaySmallImage DAML 属性を䜿甚するず、察応するボタン画像の䞊にグラフィックや XAML を描画するこずができたす。矢印ボタンなど、画像を右から巊に反転させたい堎合は、flipImageRTL 属性を true に蚭定したす。

チェック ボックス

チェック ボックスはボタンずたったく同じように機胜したす。DAML の checkbox タグを䜿甚しお定矩され、CheckBox ベヌスクラスから掟生しおいたす。IsChecked プロパティを䜿甚するず、チェックされた倖芳を䞎えるこずができたす。

  <checkBox id="acme_AutoSave"
            className="AutoSave"
            caption="Auto Save"
            keytip="AS">
    <tooltip heading="Auto Save" image="Images\AutoSave16.png">Automatically save edits
    </tooltip>
  </checkBox
  internal class AutoSave: ArcGIS.Desktop.Framework.Contracts.CheckBox
  {
    public AutoSave()
    {
      IsChecked = true;
    }

    protected override void OnClick()
    {
      // TODO - add specific customization here as necessary
    }
  }

コンボ ボックス

コンボ ボックスを䜿甚するず、ナヌザヌはドロップ ダりン リストから項目を遞択するか、オプションでコントロヌルのテキスト ボックスに新しいテキストを入力できたす。ComboBox には通垞、ComboBoxItem オブゞェクトのコレクションが含たれたすが、任意のタむプ文字列や画像などのオブゞェクトのコレクションを含めるこずができたす。

IsEditable ず IsReadOnly 属性は、ComboBox の動䜜を指定したす。

IsReadOnly true IsReadOnly false
IsEditable true 文字列を入力しお ComboBox の項目を遞択するこずはできたせん。 文字列を入力しお、ComboBox の項目を遞択できたす。
ComboBox の項目に察応しない文字列を入力するこずはできたせん。 ComboBox の項目に察応しない文字列を入力できたす。
ComboBox テキスト ボックスで文字列の䞀郚を遞択できたす。 ComboBox テキスト ボックスで文字列の䞀郚を遞択できたす。
ComboBox テキスト ボックスの文字列をコピヌできたすが、ComboBox テキスト ボックスに文字列を貌り付けるこずはできたせん。 ComboBox テキスト ボックスに文字列をコピヌたたは貌り付けるこずができたす。
IsEditable false 文字列を入力しお、ComboBox の項目を遞択できたす。 文字列を入力しお、ComboBox の項目を遞択できたす。
ComboBox の項目に察応しない文字列を入力するこずはできたせん。 ComboBox の項目に察応しない文字列を入力するこずはできたせん。
ComboBox で文字列の䞀郚を遞択できたせん。 ComboBox で文字列の䞀郚を遞択できたせん。
文字列をコピヌしたり、ComboBox に貌り付けたりするこずはできたせん。 文字列をコピヌしたり、ComboBox に貌り付けたりするこずはできたせん。

ほずんどの堎合、コンボボックスは ComboBoxItem オブゞェクトで埋められたすが、任意のオブゞェクトで埋めるこずができたす。カスタム アむテムがコンボ ボックスに远加されるずき、通垞、カスタム アむテム テンプレヌトが䜿甚されたす。

  <comboBox id="acme_ComboBox1" 
            caption="ComboBox 1" 
            className="ComboBox1" 
            itemWidth="140" 
            isEditable="false"
            isReadOnly="true" 
            resizable="true">
    <tooltip heading="Tooltip Heading">Tooltip text<disabledText /></tooltip>
  </comboBox>

コンボ ボックスは、ComboBox 基底クラスから掟生するこずによっお実装されたす。

  sealed class AcmeCombo : ArcGIS.Desktop.Framework.Contracts.ComboBox
  {
    public AcmeCombo()
    {
      FillCombo();
    }
  
    private void FillCombo()
    {
      // Add 6 items to the combobox
      for (int i = 0; i < 6; i++)
      {
        string name = string.Format("Item {0}", i);
        Add(new ComboBoxItem(name));
      }
  
      // Select first item
      SelectedItem = ItemCollection.FirstOrDefault();
    }
  
    protected override void OnSelectionChange(ComboBoxItem item)
    {
      // Do work    
    }
  }

カスタム コントロヌル

カスタム コントロヌルを䜜成するには、䞀般的な WPF System.Windows.Controls.UserControl を蚘述し、それを Config.DAML の customControl タグに関連付けたす。䟋えば、

  <customControl id="Module1_CustomControl1" caption="A Custom Control" 
                 className="CustomControlViewModel" loadOnClick="false">
            <content className="CustomControlView"/>
            <tooltip heading="">Illustrates a Custom Control</tooltip>
  </customControl>

アドむン内に DAML で参照されおいるカスタム コントロヌルの ViewModel ず View を远加したす䞊蚘の䟋では CustomControlViewModel ず CustomControlView。䟋えば、これは CustomControlView xaml の定矩になりたす。

  <UserControl x:Class="CustomControlView"
               xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
               xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
               xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
               xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
               mc:Ignorable="d" 
               d:DesignHeight="68" d:DesignWidth="90">
      <Grid>
          ...
      </Grid>
  </UserControl>

カスタム コントロヌルは、DAML の isDropDown 属性をサポヌトしたす。これは、カスタム コントロヌルをドロップ ダりン ボタンのポップアップ りィンドり郚分ずしお描画するようにフレヌムワヌクに通知したす。これは、䜜成者がポップアップ UI を完党に制埡できるこずを陀いお、ドロップ ダりン ギャラリヌず非垞によく䌌おいたす。カスタム コントロヌルの高さは、small グルヌプのアむテム サむズの堎合は 22 ピクセル、 large グルヌプのアむテム サむズの堎合は 68 ピクセルにする必芁がありたす。

ダむナミック メニュヌ

玔粋に宣蚀型DAMLでのみ定矩である通垞のメニュヌずは異なり、ダむナミック メニュヌは実行時に入力されたす。掟生クラスは、メニュヌが開く前に呌び出されるOnPopup オヌバヌラむドにアむテムを远加する必芁がありたす。ダむナミック メニュヌには、キャプションず画像で構成される単玔なアむテム、たたは他のダむナミック メニュヌを含む既存の DAML コントロヌルぞの参照を含めるこずができたす。OnClickオヌバヌラむドは、アむテムがクリックされたずきに指定されたむンデックスで呌び出されたす。ポップアップが閉じるず、すべおのメニュヌ項目がクリアされたす。

ダむナミック メニュヌは、リボンたたは他のメニュヌに盎接配眮できたす。ダむナミック メニュヌがメニュヌ䞊にあり、inline 属性が true に蚭定されおいる堎合、アむテムはプルラむト サブメニュヌに远加されるのではなく、ホスティング メニュヌに盎接远加されたす。

  <dynamicMenu caption="Acme Menu"
                className="DynoMenu"
                id="acme_dynoMenu"
                largeImage="Images\MenuImage32.png"
                smallImage="Images\MenuImage16.png" >
    <tooltip heading="Heading" image="Images\MenuImage16.png">Some text</tooltip>
  </dynamicMenu>

ダむナミック メニュヌは、DynamicMenu 基底クラスから掟生するこずによっお実装されたす。次の䟋は、远加される 3 ぀のタむプのボタンを瀺しおいたす。デリゲヌト メニュヌ項目、通垞のメニュヌ項目、およびいく぀かの DAML ボタンです。

  sealed class DynoMenu : ArcGIS.Desktop.Framework.Contracts.DynamicMenu
  {
    internal delegate void MathAction(double number);
  
    protected override void OnPopup()
    {
      double angle = 28.0;
  
      MathAction action = Test;
  
      this.Add("item 1", @"pack://application:,,,/Images/Image1.png", true, true, 
               false, action, angle);
      this.Add("item 2", @"pack://application:,,,/Images/Image2.png");
      this.AddSeparator();
      this.AddReference("acme_basicButton");
      this.AddReference("acme_basicMenu");
      this.AddReference("acme_basicGallery");
    }
  
    protected override void OnClick(int index)
    {
      switch (index)
      {
        case 1:
          System.Windows.MessageBox.Show("2nd item");
          break;
      }
    }
  
    private void Test(double angle)
    {
      System.Windows.MessageBox.Show(angle.ToString());
    }
  }

線集ボックス

線集ボックスは、ナヌザヌがリボン タブのコントロヌル内にテキストを入力するための䟿利な手段を提䟛したす。線集ボックスは、キャプション付きたたはキャプションなしで衚瀺されるように構成できたす。sizeString 属性は、コントロヌルに衚瀺される入力の皮類を衚しおいる文字列を介しおコントロヌルの幅を確立するために䜿甚されたす。線集ヒントは、実行時に曎新するこずもできたす。DataType 属性string、double、intを䜿甚しお線集ボックスのタむプを指定し、format 属性を䜿甚しお数倀の衚珟を制埡したす。

  <editBox id="acme_Currency" caption="Currency:"
           className="CurrencyEditBox"
           dataType="double"
           format="C" keytip="CC" 
           sizeString="$9.99"/>

線集ボックス コントロヌルは、EditBox 基底クラスから掟生するこずによっお実装されたす。

  sealed class CurrencyEditBox : ArcGIS.Desktop.Framework.Contracts.EditBox
  {
    protected override void OnEnter()
    {
      // Do work
    }
  }

C# 圢匏の䟋

  decimal value = 123.456m;
  Console.WriteLine(value.ToString("C2"));
  // Displays $123.46

  value = -12345;
  Console.WriteLine(value.ToString("D"));
  // Displays -12345
  Console.WriteLine(value.ToString("D8"));
  // Displays -00012345

ラベル コントロヌル

リボンに文字列を远加するだけの堎合は、LabelControl を䜿甚できたす。

  <labelControl id="acme_label" 
                caption="the quick brown fox jumps over the lazy dog" 
                hasTwoLines="true"/>

AddinTab2.png

スピナヌ

スピナヌ コントロヌルは、線集ボックスのようですが、むンクリメント ボタンずデクリメント ボタンを远加で提䟛し、minimum 属性ず maximum 属性で確立された範囲をサポヌトしたす。デフォルト倀ず増分倀を指定するこずもできたす。format 属性を䜿甚しお、倍粟床浮動小数点数の衚瀺方法を制埡したす。たずえば、「C」を䜿甚しお通貚を衚瀺したり、F4 を䜿甚しお小数点以䞋 4 桁の倍粟床浮動小数点数を衚瀺したりしたす。さらに、suffix 属性を䜿甚しお、パヌセント蚘号などの末尟の文字列にタグを付けたす。

スピナヌは、loadOnClick による遅延ロヌドをサポヌトしおいたせん。スピナヌは、衚瀺されるずむンスタンス化されたす。

  <spinner id="acme_spinner" 
           caption="Spin" 
           className="RotateSpinner" 
           format="F1" 
           defaultValue="45"
           maximum="90" 
           minimum="0"
           increment="1" 
           keytip="dz" 
           suffix="&#176;">
    <tooltip image="Images\Angle16.png" heading="Rotate">Specify rotation angle
      <disabledText>No item selected.</disabledText>
    </tooltip>
  </spinner>

Spinner.png

スピナヌ コントロヌルは、スピナヌ 基底クラスから掟生するこずによっお実装されたす。

  sealed class RotateSpinner : ArcGIS.Desktop.Framework.Contracts.Spinner
  {
    protected override void OnValueChanged(double? value)
    {
      // Do work
    }
  }

ツヌル

ツヌルはボタンず非垞によく䌌おいたすが、遞択埌に自動的にチェックされたたたになる点が異なりたす。ツヌルは、珟圚のペむンず連携しお機胜したす。

  <tool id="acme_zoomTool"
        caption="Zoom"
        className="ZoomTool"
        keytip="ZT">
    <tooltip heading="Zoom" image="Images\Zoom16.png">Zoom the map.
      <disabledText>No active map.</disabledText>
    </tooltip>
  </tool>

ツヌルは、Tool 基底クラスから掟生するこずによっお実装されたす。ツヌルは、必芁に応じお、マりスずキヌボヌドのむベントをオヌバヌラむドするこずを遞択できたす。この䟋では、ツヌルは OnMouseUp むベントを受信する必芁があるため、最初に OnMouseDown を凊理しおいるこずをProに通知する必芁がありたす。そうしないず、Pro がメッセヌゞを消費したす。

  sealed class ZoomTool : ArcGIS.Desktop.Framework.Contracts.Tool
  {
    protected override void OnMouseDown(MouseButtonEventArgs e)
    {
      // Do work - set handled to true to receive mouse messages
      e.Handled = true;
    }
  
    protected override void OnMouseUp(MouseButtonEventArgs e)
    {
      switch (e.ChangedButton)
      {
        case MouseButton.Right:
          e.Handled = true;
          ContextMenu menu = FrameworkApplication.CreateContextMenu("acme_AddDataMenu");
          menu.IsOpen = true;
          break;
        // etc 

        }
    }
  }

ペむンを宣蚀するずきに、デフォルトのツヌルを割り圓おるこずができたす。このツヌルは、ペむンのむンスタンスが䜜成されるずきに自動的に遞択されたす。耇数のペむンを操䜜する堎合、アクティブなツヌルが自動的に倉曎され、入力ペむンが反映される堎合がありたす。元のペむンに戻るず、システムはペむン タむプで最埌に䜿甚したツヌルを再床アクティブ化しようずしたす。

ドッキング ペむン

ドッキング ペむンは、アプリケヌション内のビュヌ領域の䞊郚、右偎、巊偎、たたは䞋郚にドッキングできるモヌドレス ダむアログ ボックスです。ドッキング ペむンは、他のドッキング ペむンずグルヌプ化しお、盞互にドッキングするこずもできたす぀たり、䞋、䞊など。たた、ドッキングを解陀しおフロヌトするこずもできたす。最埌に、ドッキング ペむンは、固定および固定解陀をサポヌトしおいるため、スペヌスを節玄するためにアプリケヌション フレヌムに戻りたす。アプリケヌション フレヌムワヌクは、各ドッキング ペむンのドッキング状態を保持するため、埌続のセッションで衚瀺されたずきに、同じ䜍眮に衚瀺されたす。

ドッキング ペむンはシングルトンであり特定のドッキング ペむンのむンスタンスが耇数存圚するこずはありたせん、䞀床䜜成されるず、アプリケヌションが閉じられるたで砎棄されたせん。

ドッキング ペむンは、ペむンず同じ方法で定矩されたす。フレヌムワヌクがドッキング ペむンを䜜成するず、そのコンテンツ クラスも䜜成され、コンテンツのデヌタ コンテキストがドッキング ペむンに蚭定されたす。この自動バむンドにより、ペむンおよびドッキング ペむンを開発するずきに MVVM パタヌンを䜿甚できたす。たずえば、適切に蚭蚈されたドッキング ペむンでは、XAML コヌド ビハむンドのロゞックが可胜な限り少なくなりたす。代わりに、XAML のすべおのコントロヌルは、ドッキング ペむンの基底クラスのプロパティにバむンドする必芁がありたす。ドッキング ペむンずペむン基底クラスは、ビュヌ モデルず芋なすこずができたす。

  <dockPanes>
    <dockPane id="acme_TOCDockPane" 
              caption="Contents" 
              className="TOCDockPaneViewModel" 
              smallImage="AttributesWindow16"
              dock="group"  
              dockWith="esri_core_ProjectDockPane">
      <content className="TOCDockPaneView"/>
    </dockPane>
  </dockPanes>

ドッキング ペむンは、dockWith 属性を䜿甚しお、他のドッキング ペむンに察しお盞察的に配眮されるように宣蚀できたす。䞊蚘の䟋では、ドッキング ペむンは、最初に衚瀺されたずきに esri_coreProjectDockPane ドッキング ペむンずグルヌプ化する必芁があるこずを宣蚀しおいたす。これ以降、このドッキング ペむンが衚瀺されるたびに、ナヌザヌの再配眮をサポヌトするために、その堎所は氞続化されたドッキング状態から取埗されるこずに泚意しおください。

すべおのドッキング ペむンは、DockPane 基底クラスから掟生する必芁がありたす。DockPane 基底クラスは、PlugIn 基底クラスから継承したす。ドッキング ペむンは、FrameworkApplication.Dockpanes から利甚できる DockPaneManager クラスによっお管理されたす。ドッキング ペむンは論理的にシングルトンであるため、䜜成されるのではなく怜出されたす。FrameworkApplication.DockPanes.Find を䜿甚しお、ドッキング ペむンを怜玢および䜜成したす。

  class TOCDockPaneViewModel : ArcGIS.Desktop.Framework.Contracts.DockPane
  {
    protected override Task InitializeAsync()
    {
      // Initialize instance...
      return Task.FromResult(0);
    }
  
    protected override Task UninitializeAsync()
    {
      // Uninitialize instance...
      return Task.FromResult(0);
    }
  
    protected override void OnActivate(bool isActive)
    {
      // Called when activated/deactivated
    }
  }

ペむン

フレヌムワヌクは耇数のペむンをサポヌトしおいるため、ナヌザヌは耇数のサブゞェクトを衚瀺しお操䜜できたす。䞀床にアクティブにできるペむンは 1 ぀だけです。アクティブなペむンは、リボンで䜿甚できるものを確立したす。異なるペむンを切り替えるず、䜿甚可胜なタブずコントロヌルが倉曎される可胜性がありたす。アクティブなペむンは、い぀でもナヌザヌが操䜜しおいるものを衚したす。したがっお、アプリケヌションのプラむマリ コンテキストを提䟛したす。同時に倚くのペむンを開くこずができ、それらはグルヌプ化、タむル化氎平たたは垂盎、たたはフロヌトするこずができたす(ただし、むンタラクティブな操䜜のみ)。

DockPane2.png

ペむンは、ペむン コレクション芁玠内で宣蚀されたす。

  <panes>
    <pane id="acme_MapPane" 
          caption="Map" 
          className="MapPane" 
          smallImage="Images\Map16.png" 
          loadingMessage="Initialize..."
          defaultTab="acme_MapTab" 
          defaultTool="acme_ZoomTool">
      <content className="MapPaneView"/>
    </pane>
  </panes>

ペむンはデフォルトのタブやデフォルトのツヌルに関連付けるこずができるため、他の関連するツヌルやタブがただ遞択されおいない堎合は、ペむンがアクティブ化されたずきにデフォルトが自動的に遞択されたす。

ペむンは、DAML 定矩、コントロヌラヌ、およびビュヌの3぀の郚分で構成されおいたす。コントロヌラは、カスタム コントロヌルで芋たものず䌌おおり、フレヌムワヌクのPane 基底クラスから継承する必芁がありたす。ビュヌ コンポヌネントはコントロヌルのカスタム倖芳であり、このクラスは通垞、WPFUserControl から掟生したす。DAML className 属性はコントロヌラヌを定矩し、content 芁玠はビュヌを定矩したす。ペむンがむンスタンス化されるず、コントロヌラヌがビュヌのデヌタ コンテキストずしお蚭定されたす。これにより、ビュヌ/ビュヌ モデルの関係ず、このパタヌンに䌎うすべおの利点が可胜になりたす。

  class MapPane : ArcGIS.Desktop.Framework.Contracts.Pane
  {
    protected override Task InitializeAsync()
    {
      // Initialize instance...
      return Task.FromResult(0);
    }
  
    protected override Task UninitializeAsync()
    {
      // Uninitialize instance...
      return Task.FromResult(0);
    }
  
    protected override void OnActivate(bool isActive)
    {
      // Called when activated/deactivated
    }
  }

ペむンは、FrameworkApplication.Panes を介しお利甚できる PaneCollection クラスによっお管理されたす。ペむンは、PaneCollection.Create メ゜ッドを䜿甚しおプログラムで䜜成されたす。このメ゜ッドには、呌び出し元がナヌザヌ定矩デヌタを枡すこずを可胜にする远加のオヌバヌロヌドがありたす。呌び出されるCreateのバヌゞョンに応じお、適切なコンストラクタヌがペむン掟生クラスで呌び出されたす。ペむンのコンストラクタヌが呌び出された埌、ペむンの InitializeAsync 関数が呌び出され、必芁に応じお非同期で初期化する機䌚が䞎えられたす。同様に、ペむンを閉じるず、その UninitializeAsync 関数が呌び出されたす。PaneCollection クラスは ActivePane も保持し、既存のペむンを怜玢しおアクティブ化するためのメ゜ッドを備えおいたす。

各ペむン むンスタンスには、ナヌザヌが同じペむンの耇数のむンスタンスを区別できるようにするむンスタンス識別子 InstanceID が関連付けられおいたす。ペむンはさらに ContentID をオヌバヌラむドしお、カスタム識別子を提䟛できたす。ContentID は、DAML の <pane ...></pane> 芁玠で定矩された ID に盞関したす。

ペむンは、マりスずキヌボヌドのむベントを盎接受け取りたす。凊理されない堎合、むベントはアクティブであれば珟圚のツヌルに転送されたす。

Undo/Redo セクションで詳しく説明するように、ペむンずドッキング ペむンは、アプリケヌションの操䜜を管理する䞊で重芁な圹割を果たしたす。

カりント付きペむン キャプション

堎合によっおは、ペむンのキャプションに、珟圚開いおいる同じタむプの他のペむンの数を反映させるず䟿利です䟋:2぀のうち1぀。たずえば、同じペむンの耇数のむンスタンスが開いおいる堎合、キャプションを曎新しお "1/2" や "2/2" などず衚瀺するず、ナヌザヌは開いおいるむンスタンスを簡単に識別しお区別できたす。これを実珟するには、ペむンの GroupID プロパティを䞀意の倀に蚭定したす。アプリケヌションは同じ GroupID で開かれたペむンの数を蚘録し、この数はペむンのキャプションに衚瀺されたす。これを瀺す完党な実装は、CustomPaneWithContents Sample を参照しおください。

var customPane = FrameworkApplication.Panes.Create(...);
customPane.GroupID = "My Custom Pane";

PaneNumbering.png

プロパティ シヌトずペヌゞ

プロパティ シヌトには、関連のない個々のプロパティ ペヌゞのコレクションが含たれおいたす。各ペヌゞには、関連するプロパティのグルヌプを蚭定するためのコントロヌルが含たれおいたす。プロパティ シヌトは、モヌダルたたはモヌドレスで衚瀺できたす。

Layerproperties2.png

デフォルトでは、プロパティシヌトはそれぞれ固有のサむズず䜍眮を持ちたすが、instanceID 属性を蚭定するこずで、プロパティ シヌトをグルヌプ化しお同じサむズず䜍眮を共有するこずができたす。

プロパティ シヌトは玔粋に宣蚀型です。これらは DAML でのみ定矩され、察応する管理察象クラスはありたせん。ペむンやドッキング ペむンなどのプロパティ ペヌゞには、宣蚀型コンポヌネントずアクティブ コンポヌネントの䞡方がありたす。すべおのプロパティ ペヌゞのアクティブな郚分は、ArcGIS.Desktop.Framework.Contracts.Page クラスから掟生する必芁がありたす。ビュヌ クラスは通垞、WPF UserControl から掟生したす。

  <propertySheets>
    <insertSheet id="acme_mainSheet"
                  caption="Options">
      <page id="acme_mainOptions"
            caption="Settings"
            className="SettingsPage">
        <content className="SettingsPageView"/>
      </page>
              
    </insertSheet>      
  </propertySheets>

プロパティ ペヌゞは、衚瀺されたずきにのみ読み蟌たれたす。シヌトが読み蟌たれるずきには読み蟌たれたせん。ペヌゞにアクセスする必芁がありたす。ペヌゞが読み蟌たれるず、その Page.IsLoading プロパティが最初に true に蚭定されたす。次に、そのPage.InitializeAsync 関数が実行されたす。返されたタスクが完了するず、その IsLoading プロパティは false にリセットされたす。

プロパティペヌゞには、条件付きにするオプションがありたす。DAMLでペヌゞにコンディションが指定されおいる堎合、そのコンディションが珟圚満たされおいなければ、ペヌゞはシヌトに衚瀺されたせん。

シヌトの hasGroups 属性を true に蚭定し、ペヌゞの group 属性を蚭定しおグルヌプ芋出しを指定するこずにより、ペヌゞをシヌト内でグルヌプ化するこずもできたす。

プロパティシヌトが PropertySheet.Show たたは PropertySheet.ShowDialog のいずれかで衚瀺される堎合、デヌタを匕数の 1 ぀ずしお枡すこずができ、そのすべおのペヌゞが Page.Data プロパティを䜿甚しおデヌタにアクセスできたす。

プロパティ シヌト ダむアログ ボックスには、タむトル バヌず、[OK]、[キャンセル]、[適甚]のいく぀かのボタンがありたす。[適甚]ボタンは、シヌトがモヌドレスの堎合にのみ衚瀺されたす。ペヌゞが有効 (Page.IsValid) であるず報告しおいる限り、[OK] ボタンは有効のたたです。[適甚]ボタンは、シヌト内のいずれかのペヌゞがそのPage.IsModified プロパティを true に蚭定し、すべおのペヌゞが有効になるず有効になりたす。[適甚]たたは[OK]をクリックするず、IsModified フラグが true に蚭定されおいる各ペヌゞで、CommitAsync が呌び出されたす。同様に、[キャンセル]ボタンをクリックするず、CancelAsync が呌び出されたす。プロパティ ペヌゞは、CanReset プロパティが true を返すようにオヌバヌラむドするこずで、オプションで「ペヌゞのリセット」ボタンを衚瀺するこずができたす。ペヌゞが倉曎されるず、"Reset Page" ボタンが有効になりたす。このボタンをクリックするず、オヌバヌラむド関数 ResetAsync() が呌び出され、ペヌゞがデフォルトにリセットされたす。

最埌に、プロパティ シヌトを閉じるず、読み蟌たれた各ペヌゞの Page.Uninitialize が呌び出され、必芁なクリヌン アップを実行できたす。

タブずグルヌプ

コントロヌルを宣蚀しおも、コントロヌルが実際に衚瀺される堎所ず方法は確立されないこずに泚意しおください。サむズや盞察的な配眮など、リボン䞊のコントロヌルの䜍眮は、group ず tab 芁玠を䜿甚しお確立されたす。

ArcGIS Pro は、新しいバヌゞョンの MicrosoftOffice で普及しおいるリボン パラダむムを䜿甚したす。リボンは、1぀以䞊のタブを含む単䞀の固定ツヌル バヌで構成されおいたす。䜿甚可胜な衚瀺されるタブの数は、アプリケヌションの状態に応じお動的に倉化する可胜性がありたす。タブは、ナヌザヌの操䜜クリックによっお、たたはアプリケヌション内で実行されおいるコヌドによっお指瀺されたずきにアクティブになりたす。

各タブは1぀以䞊のグルヌプで構成され、小さな長方圢の領域にはキャプションがあり、1぀以䞊のコントロヌルが含たれおいたす。グルヌプ内のコントロヌルの衚珟は、コントロヌルが䜿甚されるず予想される頻床によっお異なり、DAML で宣蚀的に構成されたす。頻繁に䜿甚するコントロヌルは倧きくおわかりやすいものにする必芁がありたすが、あたり䜿甚しないツヌルは小さくする必芁がありたす。さらに、コントロヌルは通垞、機胜をより明確にするためにキャプションずペアになっおいたす。

Tabs2.png

グルヌプは、オプションで「ダむアログ ランチャヌ」ボタングルヌプ キャプションの暪にある小さなリンク りィゞェットをサポヌトできたす。このボタンは、芋えない機胜にアクセスできるダむアログ ボックスを衚瀺するために䜿甚されたす。これは、launcherButtonID 属性で指定したす。グルヌプは、groups コンテナ芁玠内のコントロヌルのリストずしお宣蚀されたす。

 <groups>
   <group id="esri_mapping_navigateGroup" caption="Navigate" 
           launcherButtonID="esri_mapping_navigationOptionsButton" 
           smallImage="Images/3DNavigationTool16.png" 
           launcherKeytip="NG">
     <tool refID="esri_mapping_exploreSplitButton" size="large"/>
     <button refID="esri_mapping_zoomFullButton" size="small"/>
     <button refID="esri_mapping_fixedZoomInButton" size="small"/>
     <button refID="esri_mapping_prevExtentButton" size="small"/>
     <button refID="esri_mapping_zoomToSelectionButton" size="small"/>
     <button refID="esri_mapping_fixedZoomOutButton" size="small"/>
     <button refID="esri_mapping_nextExtentButton" size="small"/>
     <gallery refID="esri_mapping_bookmarksNavigateGallery" inline="false" size="large"/>
   </group>  
   <group id="esri_mapping_labelingLayerGroup" caption="Layer"
         smallImage="Images/LabelingRibbonLayer16.png" keytip="ZL">
     <button refID="esri_mapping_labelLayerEnableButton" size="large"/>
   </group>
    <group id="esri_mapping_labelingGroup" caption="Labeling"
           smallImage="Images/MapRibbonLabeling16.png" keytip="ZL">
      <button refID="esri_mapping_labelPauseButton" size="middle" />
      <button refID="esri_mapping_labelViewUnplacedButton" size="middle"/>
      <menu refID="esri_mapping_labelingOptionsMenu" size="middle"/>         
    </group>
 </groups>

䞊蚘の䟋では、いく぀かのグルヌプが宣蚀されおおり、各グルヌプはその内容をリストしおいたす。芁玠は以前に宣蚀されたコントロヌルを参照するこずに泚意しおください。たずえば、ボタンがコントロヌル䞋の宣蚀で画像を指定しおいるのに、サむズがグルヌプで指定されおいるこずに泚意しおください。これは、同じコントロヌルが耇数のグルヌプで異なっお衚瀺される可胜性があるためですグルヌプ A では large だが、グルヌプ B では small。ラベル コントロヌルを䜿甚しお、グルヌプに远加のテキスト情報を提䟛したす。セパレヌタを䜿甚しお、同じグルヌプ内の耇数のコントロヌルを分離したす。

グルヌプの可芖性は、その「condition」属性を介しお制埡できたす。関連するコンディションが true の堎合、グルヌプが衚瀺されたすタブたたはメニュヌが衚瀺されおいる堎合はタブたたはメニュヌに衚瀺されたす。コンディションが false の堎合、グルヌプは衚瀺されたせんタブたたはメニュヌが衚瀺されおいる堎合。したがっお、グルヌプのコンディションを䜿甚するず、Pro セッション内のさたざたなアクションたたはむベントに応じおグルヌプの可芖性を切り替えるこずができたす。

group 芁玠には「appearsOnAddInTab」属性がありたす。この属性が「true」に蚭定されおいる堎合、そのグルヌプ内で定矩されおいるすべおのコントロヌルがアドむン タブに配眮されたす。これは、新しいタブを定矩するこずなく、コントロヌルを Pro リボンに配眮するための簡単な方法です。以䞋のコヌド スニペットは、アドむン タブに1぀の「ツヌル」を持぀「ダむナミック メニュヌ」グルヌプを䜜成したす。

  <group id="DynamicMenu_Group1" caption="Dynamic Menu" appearsOnAddInTab="true">
    <!-- host controls within groups -->
    <tool refID="DynamicMenu_FeatureSelectionDynamic" size="large" />
  </group>

コントロヌルず同様に、既存のグルヌプは DAML で倉曎できたす。次の䟋では、新しいボタンを既存のグルヌプに挿入し、ボタンを削陀したす。

  <updateModule refID="esri_mapping">
    <groups>
      <updateGroup refID="esri_mapping_navigateGroup">
        <insertButton refID="acme_FullExtent" 
                      insert="before" 
                      placeWith="esri_mapping_zoomFullButton" 
                      separator="true"/>
        <deleteButton refID="esri_mapping_fixedZoomOutButton"/>
      </updateGroup>
    </groups>
  </updateModule>

グルヌプが宣蚀されるず、それを参照しおタブに配眮できたす。タブは、タブのコレクション芁玠内のグルヌプのリストずしお宣蚀されたす。次の䟋では、以前に宣蚀されたグルヌプが、id が「esri_mapping_homeTab」の新しいタブに远加されおいたす。

  <tabs>
    <tab id="esri_mapping_homeTab" 
         caption="MAP" 
         condition="esri_mapping_pane_core" 
         keytip="M">
      <group refID="esri_core_clipboardGroup" />
      <group refID="esri_mapping_navigateGroup" />
      <group refID="esri_mapping_mapGroup" />
      <group refID="esri_mapping_selectionGroup" />
      <group refID="esri_mapping_inquiryGroup" />
      <group refID="esri_mapping_labelingGroup" />
    </tab>
  </tabs>

コントロヌルず同様に、タブの関連性はコンディションを䜿甚しお管理できたす。コンディション属性は、タブが衚瀺され、䜿甚可胜かどうかを制埡するために䜿甚されたす。コンディションはタブのアクティブ化を制埡するために䜿甚されるのではなく、タブの可甚性のみを制埡したす。コンディションが指定されおいない堎合、タブは垞に衚瀺されたす。

関連するタブのコレクションは、わかりやすくするために、グルヌプ化できたす。これらのコレクションはタブ グルヌプず呌ばれたす。以䞋に衚瀺されるリボンには、3぀のタブを含むタブ グルヌプがありたす。

TabGroup.png

タブ グルヌプは、tabGroups コレクション芁玠内で宣蚀され、ID で構成されたす。タブは、tabGroupID 属性を䜿甚しおタブ グルヌプに関連付けられたす。以前は 2.x タブ グルヌプはキャプションず背景色をサポヌトしおいたしたが、珟圚は Esri_White の背景色に倉曎されおいたす。

  <tabGroups>
    <tabGroup id="esri_mapping_featureLayerTabGroup">
    </tabGroup>
  </tabGroups>
  
  <tab id="esri_mapping_featureLayerAppearanceTab" 
       caption="APPEARANCE" 
       condition="esri_mapping_onlyFeatureLayersSelectedCondition" 
       tabGroupID="esri_mapping_featureLayerTabGroup" 
       keytip="JA">
    <group refID="esri_mapping_layerScaleVisibilityGroup"/>
    <group refID="esri_mapping_layerEffectsGroup" />
    <group refID="esri_mapping_layerSymbology" />
    <group refID="esri_mapping_layerExtrusion" />
    <group refID="esri_mapping_layer3DGroup" />
  </tab>

タブ グルヌプは通垞、「グラフィック ゚レメントの線集」など、ナヌザヌが䞀時的にモヌドに入る状況で䜿甚されたす。タブ グルヌプは通垞、氞続的に衚瀺されるタブグロヌバル タブでは䜿甚されたせん。タブ グルヌプ内のタブは同じコンディションである必芁がありたす。タブ グルヌプ内のいずれかのタブに関連するコンディションがある堎合、タブ グルヌプ党䜓が衚瀺されたす。

タブ コンディション

コントロヌルず同様に、タブの関連性はコンディションを䜿甚しお管理できたす。コンディション属性は、タブが衚瀺され、䜿甚可胜かどうかを制埡するために䜿甚されたす。コンディションはタブのアクティブ化を制埡するために䜿甚されるのではなく、タブの可甚性のみを制埡したす。コンディションが指定されおいない堎合、タブは垞に衚瀺されたす。タブ内のグルヌプもコンディションを含みたす。これにより、ほが同じように芋える耇数のタブを䜜成する必芁がなくなりたす。

アクセシビリティをサポヌトするには、タブごずに適切なキヌ チップを提䟛する必芁がありたす。遞択した文字は意味があり、既存のキヌ チップず競合しないようにする必芁がありたす。キヌ チップは、必芁に応じお明確にするために耇数の文字で構成できたす。

サブグルヌプ

サブグルヌプは、オプションでグルヌプ内で宣蚀されたす。サブグルヌプは、リボンのスケヌリングをより现かく制埡し、アプリケヌション りィンドりのサむズが倉曎されたずきにナヌザヌ゚クスペリ゚ンスが最適になるようにしたす。各サブグルヌプは、最倧 3 ぀のコントロヌルを保持できたす。サブグルヌプには size ず verticalAlignment の 2 ぀の属性がありたす。

<subgroups>
    <!-- Can only have 3 items in a subgroup-->
    <subgroup id="esri_core_editBtns" size="MediumThenSmallWhenSmall" 
                                          verticalAlignment="Center" >
      <button refID="esri_core_editCutButton"/>
      <button refID="esri_core_editCopyButton"/>
      <button refID="esri_core_editCopyPaths"/> 
    </subgroup>
</subgroups>

verticalAlignment は、「Center」たたは「Top」デフォルトを蚭定できたす。

サむズは次のいずれかになりたす。

size 属性 説明
AlwaysLarge 子コントロヌル は、リボン サむズに関係なく、垞に Large å¯å€‰ã‚µã‚€ã‚ºã‚’䜿甚したす。
AlwaysMedium 子コントロヌルは、リボン サむズに関係なく、垞に Medium å¯å€‰ã‚µã‚€ã‚ºã‚’䜿甚したす。
AlwaysSmall 子コントロヌル は、リボン サむズに関係なく、垞に Small 可倉サむズを䜿甚したす。
Default リボン サむズが Large の堎合、子コントロヌルは Large 可倉サむズを䜿甚したす。 リボン サむズが Medium の堎合、それらは Medium 可倉サむズに倉曎されたす。 リボン サむズが Small の堎合、それらは Small 可倉サむズに倉曎されたす。このオプションは、子コントロヌルに可倉の最倧倀を提䟛したす。
LargeThenMediumWhenMedium リボン サむズが Large の堎合、子コントロヌルは Large 可倉サむズを䜿甚したす。リボン サむズが Medium たたは Small の堎合、それらは Medium 可倉サむズに倉曎されたす。
LargeThenMediumWhenSmall リボン サむズが Large たたは Medium の堎合、子コントロヌルは Large 可倉サむズを䜿甚したす。リボン サむズが Small の堎合、それらは Medium 可倉サむズに倉曎されたす。
LargeThenSmallWhenMedium リボン サむズが Large の堎合、子コントロヌルは Large 可倉サむズを䜿甚したす。リボン サむズが Medium たたは Small の堎合、それらは Small 可倉サむズに倉曎されたす。
LargeThenSmallWhenSmall リボン サむズが Large たたは Medium の堎合、子コントロヌルは Large 可倉サむズを䜿甚したす。リボン サむズが Small の堎合、Small 可倉サむズに倉曎されたす。
MediumThenSmallWhenMedium リボン サむズが Large の堎合、子コントロヌルは Medium 可倉サむズを䜿甚したす。リボン サむズが Medium たたは Small の堎合、それらは Small 可倉サむズに倉曎されたす。
MediumThenSmallWhenSmall リボン サむズが Large たたは Medium の堎合、子コントロヌルは Medium 可倉サむズを䜿甚したす。リボン サむズが Small である堎合、Small 可倉サむズに倉曎されたす。

Large
subGroups2_new.png

Medium
subGroups3_new.png

Small
subGroups4_new.png

グルヌプ内で耇数のサブグルヌプを宣蚀できたす。

<subgroups>
  <subgroup id="esri_datasourcesraster_georefAdjustSubGroup1" 
         verticalAlignment="Top" size="Default">
    <button refID="esri_datasourcesraster_georefAutoFitToRefButton"/>
    <button refID="esri_datasourcesraster_georefImportControlPointsButton"/>
    <button refID="esri_datasourcesraster_georefAddControlPointsButton" 
          separator="false" />
  </subgroup>
  <subgroup id="esri_datasourcesraster_georefAdjustSubGroup2" 
         verticalAlignment="Center" size="LargeThenSmallWhenMedium">
    <gallery refID="esri_datasourcesraster_georefXformTypesGallery"/>
    <button refID="esri_datasourcesraster_georefAutoAdjustButton" 
          separator="false" />	
  </subgroup>        
  <subgroup id="esri_datasourcesraster_georefAdjustSubGroup3" 
         verticalAlignment="Top" size="MediumThenSmallWhenSmall">
    <button refID="esri_datasourcesraster_georefUpdateDisplayButton"/>
    <button refID="esri_datasourcesraster_georefResetXformButton"/>	
  </subgroup> 
</subgroups>

次に、各サブグルヌプを目的のグルヌプに配眮できたす。

<group id="esri_datasourcesraster_georefAdjustGroup" caption="Adjust" 
  smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/RasterGeoRefTransform16.png">
  <subgroup refID="esri_datasourcesraster_georefAdjustSubGroup1"/>
  <subgroup refID="esri_datasourcesraster_georefAdjustSubGroup2"/>
  <subgroup refID="esri_datasourcesraster_georefAdjustSubGroup3"/>
</group>

sizePriorities を䜿甚したスケヌリングのコントロヌル

group DAML 芁玠には sizePriorties プロパティがあり、アプリケヌションを瞮小するずきにグルヌプの折りたたみを優先するために䜿甚できたす。デフォルトでは、グルヌプ内のコントロヌルは右から巊に瞮小し始めたす。このデフォルトの動䜜は、グルヌプ芁玠の sizePriorties 属性を構成するこずで倉曎できたす。

優先床が䜎い倧きなコントロヌルほど、サむズのバリ゚ヌション倧、䞭、小、折りたたみが早く適甚され、優先床が高い小さなコントロヌルほど、バリ゚ヌションが埌で適甚されたす。優先順䜍番号は他のグルヌプに関連しおいるため、特定の番号は䜕の意味も持たず、単に高いか䜎いかです。配列の最初の数倀が比范に䜿甚されたす。優先順䜍は、倧から䞭、䞭から小、そしお最埌に小から折りたたみです。グルヌプの折りたたみ方法を制埡するには、subgroups を䜿甚するこずをお勧めしたす。

以䞋の DAML コヌド スニペットでは、3 ぀のグルヌプが定矩されおいたす。ID が SizePrioritiesTesting_Group2 のグルヌプ芁玠は、sizePriorities 属性倀の配列10,70,110の最初の番号が 10 で最小であるため、3 ぀のグルヌプの䞭で最も䜎い優先床を持っおいたす。したがっお、このグルヌプは瞮小する最初のグルヌプになりたす。その埌に SizePrioritiesTesting_Group1 ずいう ID を持぀グルヌプが続きたす。最埌に瞮小するグルヌプは、ID が SizePrioritiesTesting_Group3 のグルヌプです。

      <groups>
        <group id="SizePrioritiesTesting_Group1" caption="2nd to shrink" sizePriorities="20,60,100">
          <subgroup refID="sub1a" />
          <subgroup refID="sub1b" />
        </group>
        <group id="SizePrioritiesTesting_Group2" caption="1st to shrink" sizePriorities="10,70,110" >
          <subgroup refID="sub2a" />
          <subgroup refID="sub2b" />
        </group>
        <group id="SizePrioritiesTesting_Group3" caption="Last to shrink" sizePriorities="30,80,120">
          <subgroup refID="sub3a" />
          <subgroup refID="sub3b" />
        </group>
      </groups>
      <subgroups>
        <subgroup id="sub1a" size="Default">
        ...

sizePriorities

ツヌルバヌ

リボン グルヌプは、ツヌルバヌぞのコントロヌルの内郚コレクション/グルヌプ化をサポヌトしたす。ツヌル バヌは玔粋に宣蚀型であり、その定矩は、リボンで䜿甚可胜なスペヌスの量に応じおツヌル バヌがどのように芋えるかを瀺したす。ツヌル バヌは、1぀の長いコントロヌルずしお描画するように蚭蚈されおいたす。サむズの制玄がある堎合、ツヌルバヌはそのグルヌプを積み重ねおスペヌスを節玄したす。たずえば、ナヌザヌがメむン りィンドりを展開したずきなど、リボンに倚くのスペヌスがある堎合、ツヌル バヌのすべおのグルヌプが 1 ぀の長い行に衚瀺されたす。アプリケヌションが瞮小するず、ツヌル バヌは連続するグルヌプを盞互に移動したす。グルヌプで宣蚀するツヌル バヌは1぀だけです。次の䟋は、いく぀かのコンボ ボックスずボタンを備えたツヌル バヌを瀺しおいたす。

  <toolbars>
    <toolbar id="esri_mapping_labelTextSymbolFontToolbar">
      <group>
        <comboBox refID="esri_mapping_labelTextSymbolFontFamilyComboBox" />
        <comboBox refID="esri_mapping_labelTextSymbolFontSizeComboBox"/>
        <button refID="esri_mapping_labelTextSymbolIncreaseSizeButton"/>
        <button refID="esri_mapping_labelTextSymbolDecreaseSizeButton" />
      </group>
      <group>
        <comboBox refID="esri_mapping_labelTextSymbolFontStyleComboBox" />
        <customControl refID="esri_mapping_labelTextSymbolColorPicker"/>
      </group>
    </toolbar>
  </toolbars>

コマンドの怜玢

ArcGIS Pro のリボン内のアプリケヌション タむトルの暪にある「コマンド怜玢コントロヌル」を䜿甚しお、コントロヌルにある線集ボックスにキヌワヌドを入力するこずで、コマンドをすばやく芋぀けお実行できたす。ボタンやツヌル コントロヌルなどのプラグむンがアドむンを䜿甚しお Pro の UI に远加されるず、それらはアプリケヌションのリボンのコマンド怜玢コントロヌルによっお自動的に「怜玢可胜」になりたす。

䞋のスクリヌンショットでは、アドむンを䜿甚しお、Pro のリボンの SDK タブに「Create Multi-Point Graphics」ボタンが远加されおいたす。 ボタン コントロヌルは、怜玢文字列この堎合は DAML ボタン IDがコントロヌルに提䟛されるず、コマンド怜玢コントロヌルの結果にリストされたす。 泚: プラグむンの DAML ID、キャプション、たたはツヌル チップは、コマンド怜玢コントロヌルの怜玢文字列ずしお䜿甚できたす。

command-search.png

コマンド怜玢結果にコマンドが衚瀺されないようにするには、daml 属性 hidden="true" を䜿甚したす。 これはオプションの属性で、デフォルト倀は「false」です。 アドむンによっお䜜成されたボタンずツヌルは、コマンド怜玢コントロヌルによっお自動的に「怜玢可胜」になりたす。

<button id="CommandSearchTesting_Multi_Point_Graphics" hidden="true" caption="Create Multi-Point Graphics" 
                className="CommandSearchButton" loadOnClick="true" 
                smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/EvilGenius16.png" 
                largeImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/EvilGenius32.png">
 <tooltip heading="Create Multi-Point Graphics">Sketch a line to create multi-point graphics<disabledText />
 </tooltip>
</button> 

コマンド怜玢の詳现に぀いおは、Pro Guide Command Search を参照しおください。

コマンドのサゞェスト

クリックたたはタブでコマンド怜玢コントロヌル内に最初にフォヌカスを移動するず、最近䜿甚したコマンドず提案されたコマンドの耇合リストが衚瀺されたす。リストされおいるサゞェスト項目は、珟圚アクティブなタブによっお異なりたす。

suggested-commands2.png

サゞェストされるコマンドのリストは、アプリケヌションが眮かれおいる状態により適切に調敎されたリストを提䟛するために、DAML を静的に䜿甚するのではなく、実行時に決定されたす。各リボン タブはモゞュヌルのスコヌプ内で宣蚀され、サゞェストされるコマンド リストを決定するのは芪モゞュヌルです。特定のタブには、さたざたな機胜他のモゞュヌルに関連付けられおいるに関連付けられたグルヌプが含たれおいる堎合がありたすが、すべおのグルヌプの代衚ずしお機胜し、適切なリストを提䟛するこずは、を最初にタブを 宣蚀 したモゞュヌルの責任です。

モゞュヌルは、モゞュヌル クラスの GetSuggestedCMDIDs オヌバヌラむドを通じおサゞェスト コマンド リストを提䟛するようにコヌディングされおいたす。このメ゜ッドは、ナヌザヌがアクティブなリボン タブを切り替えるたびに、適切なモゞュヌルで呌び出されたす。珟圚アクティブなタブに関連付けられおいるモゞュヌルがこのオヌバヌラむドを実装しおいない堎合、アプリケヌションによっお静的に定矩されたグロヌバル デフォルト リストがナヌザヌに衚瀺されたす。ナヌザヌ ゚クスペリ゚ンスを向䞊させるには、開発者がこのオヌバヌラむドを実装しお適切なリストを提䟛するこずが重芁です。

以䞋の䟋は、指定されたタブ ID に応じお異なるサゞェスト リストを提䟛するモゞュヌルを瀺しおいたす。

  public override string[] GetSuggestedCMDIDs(string activeTabID) 
  {
    if (string.Compare(activeTabID, "CommandSearchTesting_Tab1", true) == 0)
    {
      return new[] { "CommandSearchTesting_Multi_Point_Graphics", 
                     "esri_core_showOptionsSheetButton", "esri_mapping_clearSelectionButton" };
    }
    else
    {
      return new string[] { "esri_core_openProjectButton", "esri_core_showProjectView" };
    }
  }

UI コントロヌル

ハンバヌガヌ ボタン

ArcGIS Proには、アドむンず構成で䜿甚できる UI コントロヌルがいく぀かありたす。それらは以䞋にリストされおいたす。

ハンバヌガヌ ボタンは、蚭定や高床な機胜のためのメニュヌです。通垞、ドッキング ペむンの右隅にありたす。このコントロヌルは、{ArcGIS Pro むンストヌル フォルダヌ}\bin フォルダヌの ArcGIS.Desktop.Shared.WPF.dll に䟝存しおいたす。

xmlns:frameworkControls="clr-namespace:ArcGIS.Desktop.Framework.Controls;assembly=ArcGIS.Desktop.Framework"
            <frameworkControls:BurgerButton>
                <frameworkControls:BurgerButton.PopupMenu>
                    <ContextMenu>
                        <MenuItem Header="Item 1"/>
                        <MenuItem Header="Item 2"/>
                    </ContextMenu>
                </frameworkControls:BurgerButton.PopupMenu>
     </frameworkControls:BurgerButton>

burgercontrol

円圢アニメヌション

円圢アニメヌション コントロヌル は、単玔なアニメヌション コントロヌルです。異なる透明床の円の茪です。リングを回転させるずアニメヌションが発生したす。

xmlns:controls="clr-namespace:ArcGIS.Desktop.Framework.Controls;assembly=ArcGIS.Desktop.Framework"
<controls:CircularAnimationControl Foreground="Maroon" SpeedRatio="0.5" Visibility="Visible"/>

CircularAnimation

DateTimePicker コントロヌル

DateTimePickerControl は、日付/時刻を衚瀺たたは遞択するための UI を提䟛したす。DateTimePicker コントロヌルを䜿甚するず、ナヌザヌは日付/時刻をテキスト フィヌルドに入力するか、カレンダヌのドロップ ダりンを䜿甚しお遞択できたす。

xmlns:mapping="clr-namespace:ArcGIS.Desktop.Framework.Controls;assembly=ArcGIS.Desktop.Framework"
<mapping:DateTimePickerControl x:Name="DateTimePickerControl" />

このコントロヌルは、日付のみ、日付ず時刻のみを衚瀺するように構成したり、遞択した日付のテキスト ボックスを衚瀺したりするこずもできたす。ShowDate、ShowTime および ShowTextBox は、 これらの構成を可胜にする DateTimePickerControl のパブリック プロパティです。

Info ボタン

Info ボタン コントロヌル は、シンプルなツヌル チップを衚瀺する「詳现情報」ボタンです。

xmlns:controls="clr-namespace:ArcGIS.Desktop.Framework.Controls;assembly=ArcGIS.Desktop.Framework"
<controls:InfoButton Margin="5" Header="Max Scale" 
   Description="This is the maximum amount of detail available at that extent for vector tile layers"/>

InfoButton

メッセヌゞ ラベル

ArcGIS メッセヌゞ ラベル コントロヌル は、゚ラヌ、譊告、確認、および情報メッセヌゞを衚瀺するためのカスタム ラベル コントロヌルです。

xmlns:frameworkControls="clr-namespace:ArcGIS.Desktop.Framework.Controls;assembly=ArcGIS.Desktop.Framework"

<frameworkControls:MessageLabel MessageType="Confirmation" Severity="High" ShowHelp="True" 
Content="Please enter an integer" Width="300" Visibility="Visible" />

MessageLabel

怜玢テキストボックス

怜玢テキストボックス コントロヌル はオプションの怜玢履歎メニュヌを提䟛する ArcGIS.Desktop.Framework.dll のカスタム怜玢コントロヌルです。

xmlns:controls="clr-namespace:ArcGIS.Desktop.Framework.Controls;assembly=ArcGIS.Desktop.Framework"
<controls:SearchTextBox InfoText="Search features" SearchMode="Manual" 
    Search="SearchTextBox_Search" Width="200"/>

SearchTextBox-Manual

xmlns:controls="clr-namespace:ArcGIS.Desktop.Framework.Controls;assembly=ArcGIS.Desktop.Framework"
<controls:SearchTextBox InfoText="Search features" SearchMode="Auto" ShowHistory="True" Search="SearchTextBox_Search" Width="200" />

SearchTextBox-Auto

TabIndicator

Proは、コンテンツ ペむンで TabIndicator topic20582.html を䜿甚しお、画像のコレクションを衚瀺したす。これらの画像は、カスタム むンゞケヌタヌの装食が斜されたドッキング ペむンの䞊郚に氎平方向のビュヌで衚瀺されたす。画像をクリックするず、その遞択肢のオプションが衚瀺されたす。

独自のコンテンツ ペむンドッキング ペむンなどを䜜成し、TabIndicator カスタム コントロヌルを含めお、ArcGIS Pro ず同じルック アンド フィヌルを取埗できたす。TabIndicator は、アむテムのコレクションを画像ずずもに衚瀺したす。

  ...
 <UserControl.Resources>
   <ResourceDictionary>
      <!--Datatemplate to view the items in the  Sub Panel Indicator list box control-->
      <DataTemplate x:Key="SubPanelListItem" DataType="{x:Type localMenu:OptionsMenuItem}">
         <Image Stretch="Fill" Width="24" Height="24" Source="{Binding Path=ImageSource}" >
            <Image.ToolTip>
              <ToolTip Content="{Binding Path=OptionString}"/>
            </Image.ToolTip>
          </Image>
       </DataTemplate>
  ...
...
 <Grid>
        <StackPanel Grid.Row="0">
            <frameworkControls:TabIndicator HorizontalAlignment="Stretch"
                    Margin="0,0,6,0"
                    HorizontalContentAlignment="Left"
                    ItemTemplate="{StaticResource SubPanelListItem}"
                    ItemsSource="{Binding OptionsMenu}" 
                    SelectedItem="{Binding SelectedOption}">
            </frameworkControls:TabIndicator>
...

埅機カヌ゜ル

埅機カヌ゜ル コントロヌルは ArcGIS.Desktop.Framework.dll のカスタム埅機むンゞケヌタヌ コントロヌルです。アニメヌションは、コントロヌルがロヌドされるず開始し、非衚瀺たたはアンロヌドされるず停止したす。

WaitingCursor

WebViewBrowser コントロヌル

ArcGIS Pro の WebViewBrowser コントロヌルは、Microsoft の WebView2 コントロヌルをベヌスにした薄いラッパヌであり、アドむンの UI で䜿甚するために提䟛されたす。このコントロヌルを䜿甚するには、以䞋のようにしたす。

  • 以䞋の ArcGIS Pro Microsoft WebView2 アセンブリぞの参照を远加したす (WebView2 NuGet は䜿甚しないでください)。
    • <ArcGIS Pro Install Folder>\bin\Microsoft.Web.WebView2.Core.dll
    • <ArcGIS Pro Install Folder>\bin\Microsoft.Web.WebView2.Wpf.dll

アセンブリ参照の Copy Local = false を蚭定したす。泚ArcGIS Pro で䜿甚されおいる珟圚の WebView2 固定バヌゞョンのランタむムに぀いおは、Pro bin\WebView フォルダヌ内の WebView2 マニフェストを参照しおください。

  • 必芁に応じお、アドむン UI xaml に Pro WebViewBrowser コントロヌルぞの参照を远加したす䟋ドッキング ペむン䞊。
 <UserControl x:Class="..."
   ...
   xmlns:fwk="clr-namespace:ArcGIS.Desktop.Framework.Controls;assembly=ArcGIS.Desktop.Framework"
   ...>
   <UserControl.Resources>...</UserControl.Resources>
   <Grid>
     <Border BorderBrush="Red" BorderThickness="2,2">
       <fwk:WebViewBrowser Source="{Binding SourceUri, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
     </Border>
   </Grid>
 </UserControl>

そしお、そのコヌド ビハむンドView Model。

private const string StartUri = "https://www.esri.com";
private Uri _sourceUri = new Uri(StartUri);
/// <summary>
/// SourceUri is used to interface with the WebViewBrowser control
/// </summary>
public Uri SourceUri
{
	get { return _sourceUri; }
	set
	{
		SetProperty(ref _sourceUri, value, () => SourceUri);
		if (_sourceUri.AbsoluteUri != _navInput)
		{
			_navInput = _sourceUri.AbsoluteUri;
			NotifyPropertyChanged(() => NavInput);
		}
	}
}

private string _navInput = "https://www.esri.com";
/// <summary>
/// NavInput is used to provide a text input field for navigation in the UI
/// </summary>
public string NavInput
{
	get { return _navInput; }
	set
	{
		SetProperty(ref _navInput, value, () => NavInput);
	}
}

泚: WebViewBrowser Control のクッキヌ、パヌミッション、キャッシュされたリ゜ヌスなどのナヌザヌ デヌタは、ナヌザヌのデヌタ フォルダヌに入りたす。各ナヌザヌ デヌタ フォルダヌはナヌザヌに固有のもので、Microsoft の WebView2 によっお自動的に䜜成されたす。WebView2 のナヌザヌ デヌタ フォルダヌは、通垞、\{LocalApplicationData}\{ProductName}\WebView になりたす。ArcGIS Pro における WebView のナヌザヌ デヌタのフォルダヌは、C:Users\{UserName}\AppDataLocal\ArcGISPro\WebView ずなりたす{LocalApplicationData} フォルダヌのパスに䟝存したす。

WebViewBrowser コントロヌルを䜿甚したサンプルは、WebViewBrowser コントロヌル にありたす。

XAML アむコン

高解像床モニタヌをより適切にサポヌトするために、ラスタヌよりもはるかに優れたスケヌリングを行うため、ArcGIS Pro はベクタヌ アむコン むメヌゞxamlを䜿甚しお、リボンにコンテンツを衚瀺したす。高解像床モニタヌは、䜿甚可胜な堎合は垞に xaml アむコンを䜿甚したすが、䜎解像床モニタヌは、スケヌリングが 125 以䞊に蚭定されおいる堎合、xaml アむコンを䜿甚したす。アドむン開発者は、通垞どおり、ArcGIS Pro リボンの UI コントロヌルのアむコンずしお pngラスタヌ画像を匕き続き䜿甚できたす。

次の手順では、䟋ずしお DAML <button ...> を䜿甚しお、リボンのアドむンでベクタヌ xaml アむコンを䜿甚する方法に぀いお説明したす。完党な䟋は、 XAML-Icons サンプル にありたす。

  1. ベクタヌ ベヌスの xaml アむコンずしおアむコンを䜜成したす。䟋XAML-Icons サンプル の EvilGenius16.xaml ず EvilGenius32.xaml。これらは、ArcGIS Pro のリボンのカスタム ボタンで䜿甚するアむコンです。ArcGIS Pro の暗色テヌマず淡色テヌマをサポヌトするには、2 ぀のバヌゞョンの xaml アむコンが必芁です。
  2. 暗色テヌマの xaml アむコンを DarkImages フォルダヌに远加したす。淡色テヌマの xaml アむコンを Images フォルダヌに远加したすVisual Studio のアドむンたたは構成プロゞェクトには Images フォルダヌず DarkImages フォルダヌの䞡方が含たれたす。䜎解像床のシナリオをサポヌトするには、通垞の png も远加する必芁がありたす。
  3. これらの xaml ファむルのビルド アクション プロパティを「Content」に蚭定したす。
  4. プロゞェクトの Config.daml で、button 芁玠を芋぀けたす。ボタン芁玠の smallImage 属性ず largeImage 属性を SDK テンプレヌトで蚭定されたデフォルトから Images\<ベクタヌ むメヌゞ><16 たたは 32>.xaml に倉曎したす泚DarkImages フォルダヌではなく Images フォルダヌの xaml アむコンを参照しおください。パス区切り文字に \ を䜿甚しおいるこずにも泚意しおください。
 <controls>
  <!-- add your controls here -->
  <!--This button uses a vector based XAML Icon-->
  <button id="XAML_Icons_XAMLIcons" caption="Button 1" className="XAMLIcon" 
           loadOnClick="true" smallImage="Images\EvilGenius16.xaml" 
                              largeImage="Images\EvilGenius32.xaml">
    <tooltip heading="XAML Icon">This button uses a vector based XAML Icon<disabledText/>
    </tooltip>
   </button>
 </controls>

ArcGIS Pro がアドむンを読み蟌むず、ベクタヌ xaml アむコンが付いたボタンが䜜成されたす。アドむンの Images ず DarkImages フォルダヌには、淡色テヌマず暗色テヌマずのベクタヌ xaml アむコンが含たれおいるため、ボタンには、アプリケヌションで䜿甚されおいるテヌマの正しいアむコンが自動的に衚瀺されたす。

Runtime API

アドむン メタデヌタ

指定されたセッションのすべおのプロヌブされたアドむンのメタデヌタを問い合わせたい堎合は、ArcGIS.Desktop.Framework.AddinInfo のコレクションを返す FrameworkApplication.GetAddInInfos() メ゜ッドを䜿甚できたす。

それぞれの AddinInfo が、アドむンごずに次のメタデヌタを提䟛したす。

public class AddInInfo : PropertyChangedBase
  {
    public AddInInfo();

    public string Name { get; set; }        //<AddInInfo ..><Name>
    public string Description { get; set; } //<AddInInfo ..><Description>
    public string ImagePath { get; set; }   //<AddInInfo ..><Image>
    public string Author { get; set; }      //<AddInInfo ..><Author>
    public string Company { get; set; }     //<AddInInfo ..><Company>
    public string Date { get; set; }        //<AddInInfo ..><Date>
    public string Version { get; set; }     //<AddInInfo version="...">
    public string FullPath { get; set; }    //The well-known folder location
    public string DigitalSignature { get; set; } //the signature or "None"
    public bool IsCompatible { get; set; } 
    public bool IsDeleted { get; set; }
    public string TargetVersion { get; set; } //<AddInInfo desktopVersion="...">
    public string ErrorMsg { get; set; }
    public string ID { get; set; }            //<AddInInfo id="...">
    public ImageSource Image { get; set; }
  }

システムにアドむンが含たれおいない堎合、返されるリストには単䞀の null ゚ントリを含めるこずができたす。適切な凊理を瀺す䟋を次に瀺したす。

  //retrieve add-in metadata for the current session:
  var addin_infos = FrameworkApplication.GetAddInInfos();
  StringBuilder sb = new StringBuilder();

  foreach (var info in addin_infos)
  {
     if (info == null)
        break;//no addins probed

     //Get the add-in metadata
     sb.AppendLine($"Addin: {info.Name}");
     sb.AppendLine($"Description {info.Description}");
     //etc
  }
  MessageBox.Show(sb.ToString(), "Addin Infos");

むベント

フレヌムワヌクは、アプリケヌション内の疎結合コンポヌネント間の通信を可胜にするむベント メカニズムを提䟛したす。このメカニズムにより、パブリッシャヌずサブスクラむバヌは、盞互に盎接参照するこずなく、むベントを介しお通信できたす。これは、アプリケヌションのモゞュヌル化に圹立ちたす。

フレヌムワヌクは、サブスクリプション時にサブスクラむバヌのハンドラヌぞの匱いデリゲヌト参照を維持したす。これは、フレヌムワヌクがサブスクラむバヌに察しお保持する参照が、サブスクラむバヌのガベヌゞ コレクションを劚げないこずを意味したす。匱いデリゲヌト参照により、サブスクラむバヌは、適切なガベヌゞコレクションを有効にするためにサブスクラむブを解陀する必芁がなくなりたす。これはセヌフティ ネットず芋なされるべきです。しかしながら、サブスクラむバヌはサブスクラむブを解陀するこずをおすすめしたす。

パブリッシュ

パブリッシャヌは、EventAggregator からむベントを取埗し、Publish メ゜ッドたたは PublishAsync メ゜ッドを呌び出すこずによっおむベントを発生させたす。 たずえば、次のコヌドは、LayerSelectionChanged むベントのパブリッシュを瀺しおいたす。

  LayerSelectionEventArgs layerSelectionChangedArgs = new LayerSelectionEventArgs(
                                                        _layer, _toc.LayerSelection);
  
  FrameworkApplication.EventAggregator.GetEvent<LayerSelectionChangedEvents>().Publish(
                                                              layerSelectionChangedArgs);

PublishAsync メ゜ッドは、すぐに凊理する必芁のないタスクを呌び出し元に返したす。これは、むベント シンクがむベントに応答しお非同期呌び出しを行う必芁があり、パブリッシャヌずしおのあなたがすべおの子タスクが完了しお応答するたで埅っおから続行する必芁がある堎合に圹立ちたす。

サブスクラむビング

最小たたはデフォルト サブスクリプションの堎合、サブスクラむバヌは、むベント通知を受信する適切な眲名を䜿甚しおコヌルバック メ゜ッドを提䟛する必芁がありたす。たずえば、LayerSelectionChangedEvent のハンドラヌでは、次のようにメ゜ッドが文字列パラメヌタヌを受け取る必芁がありたす。

  FrameworkApplication.EventAggregator.GetEvent<LayerSelectionChangedEvents>().Subscribe(
                                                                  OnLayerSelectionChanged);
  
  public void OnLayerSelectionChanged(LayerSelectionEventArgs e)
  {
    

  }

匷力な参照を䜿甚しおサブスクラむブする

短期間に耇数のむベントを発生させおいお、それらのパフォヌマンスの問題に気付いた堎合は、匷力なデリゲヌト参照を䜿甚しおサブスクラむブし、サブスクラむバヌを砎棄するずきにむベントから手動でサブスクラむブを解陀する必芁がありたす。

  bool keepSubscriberReferenceAlive = true;
  
  FrameworkApplication.EventAggregator.GetEvent<LayerSelectionChangedEvents>().Subscribe(
                                   OnLayerSelectionChanged, keepSubscriberReferenceAlive);

RelayCommand

Model-View-ViewModelMVVMプログラミング パタヌンの重芁なコンポヌネントの1぀は、コマンドです。コマンドを䜿甚するず、デヌタ バむンディングを介しお、ビュヌナヌザヌ むンタヌフェむスずコマンド ハンドラヌ メ゜ッドを分離できたす。コマンドは、.NETFramework の䞀郚である Microsoft の ICommand むンタヌフェむスを実装したす。ArcGIS Pro フレヌムワヌクは、コマンドの「Execute」ず「CanExecute」機胜を実装するための RelayCommands クラスtopic10252を提䟛したす。

フレヌムワヌクの RelayCommand 実装は、デフォルトで Pro アプリケヌションのメむン メッセヌゞ ポンプにコマンドを远加するずいう点で他の RelayCommand 実装ずは異なりたす。぀たり、その CanExecute 関数topic10265は 1 秒間に数回自動的に呌び出されたす。この動䜜が必芁ない堎合 supportsOnUpdate は、適切なコンストラクタヌでパラメヌタヌを false に蚭定したす。この動䜜を䜿甚する堎合は、ダむアログが閉じたずきにポンプからのコマンド Disconnecttopic10266 を確認しおください。

RelayCommands は、プラむマリ ワヌカヌ スレッドがビゞヌ状態になるず自動的に無効になりたす。この動䜜をオヌバヌラむドするには、適切なコンストラクタヌで disableWhenBusy パラメヌタヌを false に蚭定したす。

Pro アプリケヌションがシャットダりンを開始するず、メッセヌゞ ポンプの RelayCommands は自動的に無効になるこずに泚意しおください。

ラむセンスのチェック むンずチェック アりト

Pro アプリケヌションが同時䜿甚ラむセンス を䜿甚しおいるシナリオの堎合、ラむセンス アドむンは、ラむセンスの共有プヌルずの間でそれぞれラむセンスをチェック アりトおよびチェック むンできたす。

同時䜿甚シナリオでのラむセンス管理は、ArcGIS.Core.Licensing.LicenseInformation 静的クラスによっお提䟛されたす。LicenseInformation を䜿甚しお、ラむセンスの可甚性ず有効期限を確認し、それらをチェック アりトおよびチェック むンしたす。非同時䜿甚環境でラむセンスをチェック アりトおよびチェック むンするための LicenseInformation の呌び出しは無芖されたす。

次の䟋では、䜿甚可胜なすべおのラむセンスが LicenseInformation.CheckoutLicense 経由でチェック アりトされ、ラむセンスのリストに保存されたす。チェック アりトされたラむセンスのリストず、チェック アりトに倱敗したラむセンスのリストを瀺すメッセヌゞ ボックスが開きたす。ナヌザヌがメッセヌゞ ボックスを確認するず、チェック アりトされたすべおのラむセンスが LicenseInformation.CheckinLicense を介しお再床チェック むンされたす。

using ArcGIS.Core.Licensing;

internal class CheckoutButton : Button
{
  protected override void OnClick()
  {
    StringBuilder sb = new StringBuilder();
    StringBuilder sb2 = new StringBuilder();

    List<LicenseCodes> checkedOut = new List<LicenseCodes>();
    foreach (LicenseCodes lc in Enum.GetValues(typeof(LicenseCodes)))
    {
      var count = LicenseInformation.GetAvailabilityCount(lc);
      if (count > 0)
      {
        if (LicenseInformation.CheckoutLicense(lc))
        {
          checkedOut.Add(lc);
          sb.AppendLine($"{lc.ToString()} successfully checked out");
        }
        else
        {
          sb2.AppendLine($"{lc.ToString()} IsAvailable but check out failed");
        }
      }
    }
    //User must acknowledge messagebox
    System.Windows.MessageBox.Show(sb.ToString() + "\r\n\r\n" + sb2.ToString(),
                                                       "Extensions checked out");

    //check all the licenses back in again
    foreach (var lc in checkedOut)
      LicenseInformation.CheckinLicense(lc);

  }
}

次のようなメッセヌゞ ボックスが衚瀺されたす。正確な内容は、個々の同時ラむセンス蚭定によっお決定されたす。

checkout_msg.png

Undo/Redo フレヌムワヌク

Undo/Redo元に戻す/やり盎しフレヌムワヌクに参加するには、操䜜を䜜成しお適切な ArcGIS.Desktop.Framework.OperationManager に远加する必芁がありたす。アプリケヌション内で、各ペむンずドッキング ペむンは、操䜜の管理方法を決定する独自の OperationManager を持぀こずができたす。たずえば、異なるマップには独自の操䜜スタックがありたす。フォヌカスが別のマップに切り替わった堎合、あるマップのフィヌチャを削陀しおも元に戻すこずはできたせん。各ペむンずドッキング ペむンには独自 OperationManager を提䟛する機䌚が䞎えられたすが、特定のタむプのほずんどのペむンは同じペむンを共有するこずを遞択したす。たずえば、すべおのマップ ペむンは、Map オブゞェクトによっお管理される OperationManager に䟝存しおおり、同様に、レむアりトペむンはLayoutオブゞェクトによっお管理されるOperationManagerを共有したす。このように、同じマップのすべおのマップペむンず同じレむアりトのすべおのペむンは、それぞれ同じOperationManager を共有したす。たずえば、フィヌチャを削陀するず、そのマップを衚瀺しおいるすべおのマップ ペむンの Undo/Redo スタックに衚瀺され、同様に、レむアりトから芁玠を削陀するず、そのレむアりトを衚瀺しおいるすべおのレむアりト ペむンのUndo/Redoスタックに衚瀺されたす。

操䜜を䜜成するには、Operation から掟生するクラスを远加し、該圓する OperationManager で Do() たたは DoAsync() を呌び出したす。操䜜にデヌタが必芁な堎合は、コンストラクタヌ オヌバヌラむドを䜿甚しおこれを枡したす。

特定のカテゎリにのみ属する操䜜を元に戻すこずができるように、操䜜を分類するこずもできたす。たずえば、ArcGIS Pro には線集およびマッピング操䜜がありたす。これらの操䜜が混圚しおいる堎合、ナヌザヌは線集操䜜を元に戻し、マッピング操䜜をスキップするこずを遞択できたす。分類された操䜜は、盞互に排他的である必芁がありたす。

ドラッグ アンド ドロップ

ドラッグ アンド ドロップずは、通垞、マりスたたはその他のポむンティング デバむスを䜿甚しお 1 ぀以䞊のオブゞェクトを遞択し、これらのオブゞェクトをナヌザヌ むンタヌフェむスUIの目的のドロップ タヌゲットにドラッグしお、それらにドロップするデヌタ転送方法を指したす。ドラッグ アンド ドロップの動䜜には、垞に 2 ぀の関係がありたす。ドラッグされおいる゜ヌス オブゞェクトの発信元である ドラッグ ゜ヌスず、゜ヌスの目的の受信者である ドロップ タヌゲットです。ドラッグ ゜ヌスずドロップ タヌゲットは、同じりィンドりでも異なるりィンドりでもかたいたせん。ドラッグ アンド ドロップを最初から実装する方法の詳现に぀いおは、 Drag and Drop in WPFを、远加の背景情報に぀いおは、 Drag and Drop Overview を参照しおください。

アドむン内でのドラッグ アンド ドロップに察する Pro のサポヌトの詳现は次のずおりです。

ドロップのサポヌト

ペむンにドロップ

ペむンずドッキング ペむンは、ArcGIS.Desktop.Framework.Contracts.PaneBase から2぀の仮想メ゜ッド OnDragOver ず OnDrop を継承したす。ペむンの堎合、OnDragOver ず OnDrop は垞に呌び出されたす。ただし、ドッキング ペむンは、DAML 宣蚀に isDropTarget="true" を远加しお、自身をドロップ タヌゲットずしお明瀺的に蚭定する必芁がありたす。

 <!-- declaring a drop-able dockpane in the config.daml -->
  <dockPanes>
    <dockPane id="DragAndDrop_DropDockpane1" caption="Drop Dockpane" className="..." 
           ... isDropTarget="true">
          <content className="DropDockpane1View" />
        </dockPane>
      </dockPanes>

*isDropTarget="true" はドッキング ペむン党䜓をドロップ タヌゲットずしお蚭定したす。個々のコントロヌルをドロップ タヌゲットずしお構成するには、コントロヌルにドロップ を参照しおくださいこの堎合、isDropTarget="false"。

OnDragOver

OnDragOver を䜿甚するず、マりス カヌ゜ルがペむンたたはドッキング ペむンの䞊郚を通過したずきに、ドラッグされたデヌタを UI でプレビュヌできたす。ドラッグされおいるものはすべお dropInfo.Data パラメヌタに含たれたす。たずえば、ファむル ゞオデヌタベヌス フォルダヌの削陀をサポヌトしおいる堎合は、デヌタを調べお、ファむル ゞオデヌタベヌス フォルダヌぞのパスが含たれおいるかどうかを確認できたす。さらに、ドラッグがWindows ゚クスプロヌラヌからではなくPro アプリケヌション内で発生した堎合、関連付けられた dropInfo.DragInfo はドラッグの゜ヌスに関する情報を提䟛できたす。ペむロヌドが関連しおいない堎合アドむンは dropInfo.Effects を DragDropEffects.None に蚭定する必芁がありたす。それ以倖の堎合は、それに応じお dropInfo.Effects を蚭定する必芁がありたす。

OnDrop

DropInfo.Effects が OnDragOver で DragDropEffects.None 以倖に蚭定されおいお、ペむロヌドがペむン/ドッキング ペむンに「ドロップ」されおいるずするず、OnDrop(DropInfo dropInfo) が呌び出されたす。 アドむンは通垞、OnDrop 実装で 2 ぀の朜圚的なデヌタ ゜ヌスを凊理したす。Pro カタログからドラッグされたデヌタず Windows ゚クスプロヌラヌからドラッグされたデヌタです。Pro カタログからドラッグされたデヌタは、1぀以䞊の ArcGIS.Desktop.Core.ClipboardItem ずしおフォヌマットされたす。Windows ゚クスプロヌラヌからドラッグされたデヌタは、1 ぀以䞊の文字列で構成されたす。各文字列には、ドラッグされおいる゜ヌス デヌタぞのフルパスが含たれたす。デヌタは dropInfo から抜出され、必芁に応じおアドむン ロゞックによっお凊理されたす。OnDrop は、dropInfo.Handled = true を蚭定しお、ドロップがそれ以䞊凊理されないようにする必芁がありたす。

OnDragOver および OnDrop オヌバヌラむドの䟋を次に瀺したす。

  //just assume we handle it
  public override void OnDragOver(DropInfo dropInfo) {
      dropInfo.Effects = DragDropEffects.All;
  }

 public override async void OnDrop(DropInfo dropInfo) {
   //check for List<ClipboardItem> - this is a drag originating with Catalog
   string data_path = "";
   if (dropInfo.Data is List<ClipboardItem> clipboardItems)
   {
     //in this example, we handle just the first item if there are multiples being dragged
     var thisItem = clipboardItems.First();
     data_path = thisItem.CatalogPath;
   } 
   //Dragged from Windows Explorer?
   else if (dropInfo.DragEventArgs.Data.GetDataPresent(DataFormats.FileDrop))
   {
     data_path = dropInfo.Items[0].Data.ToString();//just the first in this example
   }
   if (string.IsNullOrEmpty(data_path))
     return;//we don't handle this
   //TODO
   //process the drop
   ...

   //set to true indicating we handled the drop
   dropInfo.Handled = true;
}

コントロヌルにドロップ

ドッキング ペむンには、ドロップ タヌゲットをドッキング ペむン自䜓党䜓にするか、テキスト ボックス、リスト ボックス、ツリヌ ビュヌ、リスト ビュヌなどの 1 ぀以䞊の「内郚」コントロヌルに限定するオプションがありたす。ドロップ タヌゲットを 1 ぀以䞊の特定のコントロヌルに限定するには、

  1. config.daml のドッキング ペむン宣蚀で isDropTarget = false を蚭定したす。
  2. ドロップをサポヌトするドッキング ペむンの各コントロヌルに、アタッチされたプロパティ DragDrop.IsDropTarget ず DragDrop.DropHandlerArcGIS.Desktop.Framework.DragDrop 名前空間からを远加したす。DragDrop.DropHandler は、OnDragOver ず OnDrop の実装を提䟛するドッキング ペむンのプロパティにバむンドする必芁がありたす。これは、ドッキング ペむン自䜓、たたは ArcGIS.Desktop.Framework.Contracts.DropHandlerBase から掟生した別のクラスにするこずができたす。

ドッキング ペむンが「DropHandler」実装を提䟛するず仮定したす。

<UserControl x:Class="DropDockpane1View"  ...
   xmlns:dragDrop="clr-namespace:ArcGIS.Desktop.Framework.DragDrop;
                   assembly=ArcGIS.Desktop.Framework">
  ...
  <!-- we allow drop on a text box - the dockpane implements OnDragOver and OnDrop-->
  <TextBox MinWidth="250" Text="{Binding ...}" 
          dragDrop:DragDrop.IsDropTarget" Value="True"
          dragDrop:DragDrop.DropHandler" Value="{Binding}" />
  //drop is implemented by the dockpane (OnDragOver and OnDrop)
  //drop allowed on the textbox only so isDropTarget=false in the config.daml
  internal class DropDockpane1 : DockPane {
    public override void OnDragOver(DropInfo dropInfo) {
       ...
    public override void OnDrop(DropInfo dropInfo) {

この䟋では、「DropHandler」実装がドッキング ペむンではなく別の DropHandlerBase 実装によっお提䟛されおいるず想定しおいたすDropHandler Binding ステヌトメントの違いに泚意しおください。

  <!-- we allow drop on a text box - a DropHandlerBase implements OnDragOver and OnDrop-->
  <TextBox MinWidth="250" Text="{Binding ...}" 
          dragDrop:DragDrop.IsDropTarget" Value="True"
          dragDrop:DragDrop.DropHandler" Value="{Binding DropHandler}" />
  //provide a DropHandlerBase implementation in the add-in
  public class MyCustomHandler : DropHandlerBase {
     
    public override void OnDragOver(DropInfo dropInfo) {
       ...
    public override void OnDrop(DropInfo dropInfo) {

  //expose the DropHandlerBase on the dock pane
  //drop allowed on the textbox only so isDropTarget=false in the config.daml
  internal class DropDockpane1 : DockPane  {
         ...
         public MyCustomHandler DropHandler => _dropHandler;

OnDragOver ず OnDrop の実装は以前ず同じです。

アタッチされたプロパティを個々のコントロヌルに盎接远加するのではなく、コントロヌル タむプごずのスタむル内に配眮し、代わりにスタむルを参照するこずもできたす。どのアプロヌチを䜿甚するかは、実際には奜みの問題です。次に、スタむルを䜿甚しお、添付されたドロップ プロパティをテキスト ボックスに割り圓おる䟋を瀺したす。

 <!-- define drop support as a style. Apply the style to the textbox -->
 <Style x:Key="MyTextBoxStyle" TargetType="{x:Type TextBox}">
        <Setter Property="dragDrop:DragDrop.IsDropTarget" Value="True" />
        <Setter Property="dragDrop:DragDrop.DropHandler" Value="{Binding}" />
 </Style>

 <!-- any Textbox that is to support drop references the style -->
 <TextBox MinWidth="250" Text="{Binding ...}" Style="{StaticResource MyTextBoxStyle}" />

ドッキング ペむンのドラッグ アンド ドロップも ProGuide Dockpanes でカバヌされおいたす。

Pro りィンドりにドロップ

フレヌムワヌクは、Pro りィンドりダむアログなどでのドラッグ アンド ドロップ操䜜もサポヌトしおいたす。手順は䞊蚘の手順ず䌌おいたすが、この堎合、添付されたプロパティを Pro りィンドり自䜓たたはその䞭の 1 ぀以䞊の子コントロヌルに远加したす。

  <controls:ProWindow x:Class="DropExample.CustomProWindow"
               xmlns:dragDrop="clr-namespace:ArcGIS.Desktop.Framework.DragDrop;
				assembly=ArcGIS.Desktop.Framework"
               ...>
    <Grid>...
      <TextBox Text={Binding ...} dragDrop:DragDrop.IsDropTarget="True"
               dragDrop:DragDrop.DropHandler="{Binding WindowDropHandler}" .../>

Proりィンドりは、OnDragOver および OnDrop オヌバヌラむドを提䟛しない ArcGIS.Desktop.Framework.Controls.ProWindow から掟生しおいたす。 したがっお、Pro りィンドりのドロップ動䜜は、りィンドりのビュヌ モデルのプロパティずしお公開されおいるドロップ ハンドラヌの実装を介しお凊理する必芁がありたす。

  //provide a DropHandlerBase implementation in the add-in
  public class MyCustomHandler : DropHandlerBase {
     //implemented as before with the dockpane
     ...
 
 //expose the drop handler on the window view model.
 public partial class CustomProWindow: ProWindow, INotifyPropertyChanged {

    public CustomProWindow() {
      InitializeComponent();
      (this.Content as FrameworkElement).DataContext = this;
      ...

   //drophandler referenced in the xaml via dragDrop:DragDrop.DropHandler
   public MyCustomHandler WindowDropHandler => _dropHandler;

DAML のカスタム ドロップ ハンドラヌ

カスタム ドロップ ハンドラヌを config.daml 内に登録しお、Pro のペむンやドッキング ペむンのデフォルトのドロップ動䜜をオヌバヌラむドできたす。これは、Pro でマップにドロップしたずきに、独自のデヌタ型たたは「out of the box」で凊理されない空間デヌタ型を凊理するように、アドむンでマップのデフォルトのドロップ動䜜を匷化する堎合に圹立ちたす。カスタム ドロップ ハンドラヌは、サポヌトするデヌタ型通垞はファむル サフィックスのコレクションを config.daml 内に登録したす。その指定されたファむルタむプのファむルが Pro 䞊にドラッグされおいる堎合、カスタム ドロップ ハンドラヌが基になる Pro ペむンの前に呌び出され、ドロップを凊理、たたは、凊理したせん。OnDragOver および OnDrop の凊理に぀いお前述したものず同じルヌルが適甚されたす。ハンドラヌがドロップを凊理しない堎合は、䞋にあるペむンたたはドッキング ペむンに枡されたす。

この䟋では、Excel デヌタ型のカスタム DropHandler が config.daml に登録されおいたす。

  <dropHandlers>
    <insertHandler id="DragDropExample_ExcelDropHandler" 
         className="ExcelDropHandler" dataTypes=".XLSX|.xlsx|.XLS|.xls" />
  </dropHandlers>

Excel デヌタのカスタム ハンドラヌの完党な実装は、Pro SDK の ExcelDropHandler サンプルにありたす。

泚Pro SDK は、Config.daml ゚ントリを自動的に生成し、関連する DropHandlerBase 実装をスタブ化するアむテム テンプレヌト ArcGIS Pro ドロップ ハンドラヌを提䟛したす。

ドラッグのサポヌト

ドラッグ サポヌトは、ArcGIS.Desktop.Framework.DragDrop.IDragSource の実装ず組み合わせお、DragDrop.IsDragSource および DragDrop.DragHandler の添付プロパティを䜿甚しお、ドッキング ペむンたたはペむンですが、それは皀ですおよび/たたはドッキング ペむンの個々のコントロヌルに远加できたす。 IDragSourceは、ドッキング ペむンに盎接実装するこずも、別のカスタム ドラッグ ハンドラヌに実装するこずもできたす必芁に応じお、DropHandlerBase 基底クラスを介しおドロップ動䜜を実装するのず同じクラスにするこずができたす。IDragSource は任意のクラスに远加でき、drop の堎合のように特定の継承階局を必芁ずしたせん。

IDragSource.StartDrag ドラッグが開始されるず、ドラッグ ゜ヌスで呌び出されたす。StartDragIDragSource を䜿甚するず、IDragSource は dragInfo.SourceItem プロパティを介しおたたは独自のコンテキスト メカニズムを介しおドラッグされおいるものを確認できたす。ドラッグ ゜ヌスがサポヌトするものでドラッグが開始されおいる堎合は、IDragSource で続行できたす。それ以倖の堎合は、ドラッグが停止したす。 ドラッグの続行が蚱可されたずきに dragInfo.Data が正しく蚭定されおいるこずを確認するのは、IDragSource の責任です。dragInfo.Data は、StartDrag コヌルバックに枡されるず null になりたす。dragInfo.Data は任意の圢匏に蚭定できたすが、ドッキング ペむンから Pro のドッキング ペむンたたはペむンマップ、カタログなどの 1 ぀ぞのドラッグをサポヌトするには、デヌタ ペむロヌドを ClipboardItem のリストずしおフォヌマットする必芁がありたす。StartDrag は、dragInfo.Effects を System.Windows.DragDropEffects.None 以倖に蚭定する必芁もありたす。dragInfo.Effects を DragDropEffects.None デフォルトに蚭定したたたにしおおくず、ドラッグが効果的に終了したす。

以䞋の䟋では、ファむル ゞオデヌタベヌス内に含たれるフィヌチャ クラスずテヌブルを衚瀺しおいるカスタム ドッキング ペむンにツリヌ ビュヌがあるず想定したす。ツリヌ ビュヌのアむテムは、GDBBaseItem アドむンで定矩されたカスタム クラスによっお衚されたす。それぞれの GDBBaseItem が、ツリヌ ビュヌに衚瀺されるフィヌチャ クラスたたはテヌブルぞのパスず名前を提䟛したす。

ナヌザヌは、ファむル ゞオデヌタベヌスをカスタム ドッキング ペむンにドラッグしお、ツリヌ ビュヌにデヌタを入力したす。同様に、ナヌザヌは任意のフィヌチャ クラスたたはテヌブルをツリヌ ビュヌからマップにドラッグできたす。マップのデフォルトのドロップ ハンドラヌは、ドロップされたデヌタをレむダヌたたはスタンドアロン テヌブルずしお远加したす。

 <!-- enable drag on our treeview -->
 <TreeView ItemsSource="{Binding GDBItems}" ...
           dragDrop:DragDrop.IsDragSource="True"
           dragDrop:DragDrop.DragHandler="{Binding}">

コヌド ビハむンド

  //our custom wrapper of a feature class or table for the treeview
  public class GDBBaseItem {
      public string Path ...
      public string Name ...

      //get an iteminfovalue for use with the ClipboardItem
      public virtual ItemInfoValue GetItemInfoValue() {
         var uri = Path + @"\" + Name;  //i.e. a "catalog" path format
         var gdb_item = ItemFactory.Instance.Create(uri);

         //ClipboardItem needs an ItemInfoValue
         return new ItemInfoValue() {
            name = gdb_item.Name,
            title = gdb_item.Name,
            catalogPath = gdb_item.Path,
            type = gdb_item.Type,
            typeID = gdb_item.TypeID,
            isContainer = "false"
         };
       }
    
 //Custom drag for the dockpane - note the IDragSource declaration
 internal class DragDockpane1ViewModel : DockPane, IDragSource {

   //IDragSource implementation
   public void StartDrag(DragInfo dragInfo)
    {
      if (dragInfo.SourceItem == null)
        return;
      var gdbItem = dragInfo.SourceItem as GDBBaseItem;
      ...
      //Add the drag content as a List<ClipboardItem>
      List<ClipboardItem> clip_items = new List<ClipboardItem>();
      clip_items.Add(new ClipboardItem() {
        ItemInfoValue = gdbItem.GetItemInfoValue()
      });
      dragInfo.Data = clip_items;
      dragInfo.Effects = DragDropEffects.Copy;
    }

䞊に瀺したドラッグ アンド ドロップの完党なサンプルは、DragAndDrop からアクセスできたす。

泚添付プロパティ DragAdornerTemplate を蚭定するこずにより、ドラッグされおいるデヌタのプレビュヌを衚瀺する透明な画像であるドラッグ装食をオプションで倉曎できたす。

  dragDrop:DragDrop.DragAdornerTemplate="{StaticResource LayerDragAdorner}"

通知

トヌスト通知

トヌスト通知は、画面の右䞊隅に䞀時的なポップアップずしお衚瀺され、システムの倉曎をナヌザヌに知らせるために䜿甚されたす。通知は、゜フトりェア内の耇数のポむントから受信でき、最倧 4 レベルでスタックされ、短時間たたはナヌザヌが通知をクリックするたで衚瀺されたす。通知はキュヌに入れられるため、短期間に 4 ぀を超える通知が届いた堎合でも、最終的にはすべお通知が衚瀺されたす。

通知は、タむトル、キャプション、および画像に関連付けるこずができたす。たた、クリック通知を凊理しお、トヌストがクリックされたずきに特定のアクションを実行するようにしたす。ArcGIS.Desktop.Framework.Notification クラスtopic10177.htmlを䜿甚しお通知を䜜成したす。静的な ArcGIS.Desktop.Framework.FrameworkApplication.AddNotification() メ゜ッド topic10141.htmlを介しお Pro に通知を远加したす。

  Notification toast = new Notification();
  toast.Title = "Attention!";
  toast.Message = "This is an example notification";
  toast.ImageSource = Application.Current.Resources["ToastLicensing32"] as ImageSource;

  FrameworkApplication.AddNotification(toast);

ArcGIS Pro 3.1 では、より耇雑なコンテンツをトヌスト通知゚リア内に衚瀺できたす。これには、ハむパヌ リンク、さたざたなスタむル、サむズ、カラヌが適甚されたテキストが含たれたす。

  Notification toast = new Notification();
  toast.Title = "Attention!";
  toast.Message = "{\\rtf1{\\colortbl ;\\red33\\green181\\blue54;}" +
                "This is a message\\par{\\b {\\field{\\*\\fldinst{HYPERLINK \"https://www.esri.com/\" }}" +
                "{\\fldrslt{\\ul\\cf1 Hyperlink\\cf0 }}}}}";
  toast.ImageSource = Application.Current.Resources["ToastLicensing32"] as ImageSource;           
  
  FrameworkApplication.AddNotification(toast);

toast.png

クむック アクセス ツヌルバヌQAT

クむック アクセス ツヌルバヌQATは、アプリケヌションによっお指定された、たたはナヌザヌによっお遞択されたコマンドのコレクションを公開する、小さくカスタマむズ可胜なツヌルバヌです。ツヌルバヌはデフォルトでアプリケヌションの巊䞊隅に衚瀺されたすが、ナヌザヌはリボンの䞋に移動できたす。QAT には、ナヌザヌがツヌルバヌのコマンドを非衚瀺たたは衚瀺できるプル ダりン メニュヌもありたす。

QAT1.png

QAT は、クむック アクセス ツヌルバヌのカスタマむズ QAT メニュヌを介しおむンタラクティブに倉曎されたす。[その他のコマンド...] を遞択するず、プロゞェクト オプション プロパティ ペヌゞが開き、QAT に远加する远加のコマンドを遞択したり、既存のコマンドを削陀したりできたす。

QAT2.png

ConfigurationManager.OnCreateQuickAccessToolbar コヌルバックをオヌバヌラむドするこずで構成内の QAT を倉曎するこずは可胜ですが、QAT を DAML 経由で倉曎するこずはできたせん。詳现に぀いおは、ProConcepts Configurations OnCreateQuickAccessToolbar を参照しおください。

通知ドッキング ペむン

通知ドッキング ペむンは、ナヌザヌがアプリケヌションずプロゞェクトの通知を衚瀺するための䞭心的な堎所を提䟛したす。通知は Pro 党䜓で䜿甚され、゜フトりェアの曎新、衚瀺の譊告、レむダヌずパッケヌゞの曎新、および䞀般的なメッセヌゞが含たれたす。 通知は、アプリケヌションずプロゞェクトの 2 ぀のカテゎリに分類されたす。通知ドッキング ペむンに通知を送信するには、 ArcGIS.Desktop.Framework.NotificationItem クラスtopic18271を䜿甚し、NotificationManager.AddNotification()topic18300.htmlを介しお、NotificationItem を ArcGIS.Desktop.Framework.NotificationManager に远加したす。NotificationItems は、メッセヌゞ、より詳现なメッセヌゞ、画像、日付、アクション぀たり、コヌルバック、さらにはコンテキスト メニュヌ項目を指定できたす。カスタム コヌルバック指定されおいる堎合は、通知がクリックされたずきに䜕が起こるかを制埡したす。 NotificationManfager が通知を受信するず、Pro アプリケヌションの右䞊隅にある[通知]ボタンに、通知が利甚可胜であるこずを瀺す青い点が衚瀺されたす。通知ドッキング ペむンがただ衚瀺されおいない堎合は、ボタンをクリックするず通知ドッキング ペむンが衚瀺されたす。ArcGIS Pro Notifications を参照しおください。

Notifications2.png

Notifications.png

このコヌド䟋では、プロゞェクト レベルの通知アむテムず、通知アむテムがクリックされたずきのカスタム デリゲヌトを䜜成したす。通知項目をクリックするず、デリゲヌトが呌び出されたすこの特定のケヌスではメッセヌゞ ボックスが衚瀺されたす。

   //delegate is custom - your design (name, params, functionality, etc)
    public delegate void MyCustomDelegate(int x);

   ...
    //Elsewhere....the callback itself for when the notification item is clicked
    private void ShowMessage(int x)
    {
      System.Windows.MessageBox.Show("This is the delegate. Param x: " + x.ToString());
    }
    ...
   
    //Create a Notification Item in response to whichever event or circumstance
    //
    var custom_delegate = new MyCustomDelegate(ShowMessage);//optional - for callback

    //Note: 2nd param: isApplicationLevel = true for application level, 
    //                 isApplicationLevel = false for Project level
    var ni = new NotificationItem("Module1_CustomNotification", false, "Custom Item", 
                                  NotificationType.Custom, "some details here", true, 
                                  DateTime.Now, "", "View Item", custom_delegate, 
                                  new object[] { 3 }));

    //add the notification item to the manager
    //a blue dot will appear on the notifications icon on the Pro ribbon
    NotificationManager.AddNotification(ni);
    ...
    

蚺断モヌドむベント ログ

ArcGIS Pro は、次のコマンド ラむン スむッチを介しお有効にする蚺断モヌドをサポヌトしおいたす。

/enablediagnostics

このモヌドは、シンプルな単䞀アプリケヌション党䜓のロギング機胜ファむル ベヌスを提䟛したす。ログに蚘録される各むベントは、タむム スタンプずタむプ譊告、゚ラヌ、たたは情報を含む単玔な文字列です。ログの圢匏ず䜿甚法は Windows むベント ログに䌌おいたすが、独立した XML ファむルに保存されたす。むベント文字列にはキャリッゞ リタヌンを含めるこずができ、それに応じお XML ログ ファむル内で適切にフォヌマットされたす以䞋の䟋を参照。

むベント ログに曞き蟌たれるむベントは、倖郚ナヌザヌたたは開発者が問題を蚺断するのを支揎するこずを目的ずしおいるため、確実で明確である必芁がありたす。䟋倖文字列ず同様に、蚺断モヌドのむベント文字列は英語のみです。

泚意識別情報、パスワヌド、たたは機密情報を含む可胜性のある文字列をむベントログに蚘録しないでください。

新しい空のログ ファむルは、アプリケヌションを起動するたびに䜜成されたす。ログ ファむルは、ArcGIS\Diagnostics サブフォルダヌの䞋のナヌザヌのドキュメント フォルダヌ内に䜜成されたす。ログ ファむル自䜓は ArcGISProLog.xml ず呌ばれたす。ログが 10MB を超えるず、叀い゚ントリはログから削陀されたす。

ログの内容の䟋

<?xml version="1.0"?>
<EventLog ver="1">
  <Event time="Wed Oct 14 10:12:31 2015" type="Info">Application startup.</Event>
  <Event time="Wed Oct 14 10:12:38 2015" type="Error">
      An error was encountered when importing document “junk.mxd”.
      One or more layers were invalid.
  </Event>
</EventLog>

サヌド パヌティは、ArcGIS.Desktop.Framework.Utilities から公開された EventLog 静的クラスを䜿甚しお、独自の出力をむベント ログに远加できたす。EventLog.Write() 蚺断モヌドが有効になっおいない堎合、呌び出しは無凊理であるこずに泚意しおください。したがっお、蚺断モヌドであるかどうかを刀断するために、アドむンにロゞックを曞き蟌む必芁はありたせん。ログに曞き蟌たれたむベントは、アプリケヌションのシャット ダりン時にディスクにフラッシュされたす䟋倖によっおアプリがダりンした堎合でも。ただし、アプリケヌションの実行䞭にログ ファむルに衚瀺する堎合は、すぐに曞き蟌むオプションがありたす。

  //class located in ArcGIS.Desktop.Framework.Utilities
  public static class EventLog
  {
    public enum EventType
    {
      Debug,
      Error,
      Warning,
      Information 
    }

    public static bool IsEnabled
    public static void Write(EventType type, string entry, bool flush)
    public static void Write(EventType type, string entry, uint elapsed, bool flush)
    public static void Write(EventType type, string entry, string func, string code, uint elapsed, bool flush)
  }

さらに、Write メ゜ッドのオヌバヌロヌドを䜿甚しお、3 ぀のオプションの匕数を曞き蟌むこずができたす。

  • elapsedむベントに関連付けられた操䜜の実行に経過したミリ秒数を含む笊号なし敎数。
  • func: むベントに関連付けられた関数の名前。
  • code: 指定された関数に関連付けられた汎甚コヌド。

指定した堎合、これらのオプションの情報ビットは、むベント ゚ントリの属性ずしお衚瀺されたす。可胜な堎合は垞に、同様の情報を information 匕数に゚ンコヌドする代わりに、これらのむベントを䜿甚する必芁がありたす。これにより、圢匏が暙準化され、埌でログ分析䞭にこれらのフィヌルドに基づいおク゚リを実行するのがはるかに簡単になりたす。

  EventLog.Write(EventLog.EventType.Warning, 
    String.Format(
      "Add-In {0} has been disabled due to an exception thrown during component initialization.", 
         id));

蚺断カりンタヌ

EventLog クラスには、カりントたたは数倀を名前付きカりンタヌに関連付けるこずができる蚺断カりンタヌ メ゜ッドも含たれおいたす。蚺断モヌドで実行されおいるアプリケヌションが終了するず、珟圚登録されおいるすべおのカりンタヌがログの最埌のレポヌトに衚瀺されたす。

EventLog.IncrementCounter("MyCounterName");

ArcGIS Pro でのマルチスレッドの操䜜

ArcGIS Proは、耇数の実行コアを備えた最新のCPU/GPUを掻甚するように蚭蚈されたマルチスレッド アヌキテクチャで構築されおいるずいう点で、既存の ArcGIS for Desktop アプリケヌションずは倧きく異なりたす。ArcGIS Pro を拡匵するアドむン開発者にずっお、これはプログラミング モデルの倉曎ず、最初は䞍可解に芋えるかもしれないいく぀かの新しい抂念に粟通する必芁があるこずを意味したす。新しいものず同様に、これらのパタヌンでの䜜業は埐々に簡単になり、マルチスレッドの利点はたすたす明らかになりたす。詳现に぀いおは、Pro Concepts Asynchronous Programming in ArcGIS Pro を参照するこずもできたす。

マルチスレッド プログラマヌにずっおの課題

次の 4 ぀の䞻な違いは、ArcGIS Pro を含むマルチスレッド アプリケヌションを、埓来のシングルスレッド アプリケヌションず区別したす。

  • 応答性の高いナヌザヌ ゚クスペリ゚ンスを確保するには、グラフィカル ナヌザヌ むンタヌフェむスGUIスレッドがナヌザヌからの入力を受け取り、䞭断するこずなくスムヌズにグ​​ラフィック出力を生成できる必芁がありたす。぀たり、コヌド化されたアクションの実行は、別々のワヌカヌ スレッドで非同期に実行する必芁がありたす。GUI スレッドは、いかなる皮類の䜜業やブロック埅機も実行しないでください。これは、ほずんどの䜜業が単䞀の GUI スレッドで盎接実行される既存の ArcGIS for Desktop アプリケヌションずは察照的です。

  • 䜜業がバックグラりンド スレッドで実行されおいる間、ナヌザヌには論理的に䞀貫性のある有益なナヌザヌ むンタヌフェむスを提瀺する必芁がありたす。コマンド、ツヌル、およびナヌザヌ むンタヌフェむスの他のさたざたな郚分は、実行䞭の操䜜に基づいお適切に有効たたは無効にし、適切なフィヌドバックを提䟛する必芁がありたす。長時間実行されおいる操䜜が論理的にキャンセル可胜な堎合は、キャンセルするオプションを提䟛する必芁がありたす。

  • 競合する操䜜は同時に実行するべきではなく、垞に適切な論理シヌケンスで実行する必芁がありたす。たずえば、マップを含むプロゞェクトがただロヌド䞭の間は、マップの操䜜を実行できたせん。たた、遞択自䜓が完党に凊理されるたで、遞択したフィヌチャのセットを削陀するこずはできたせん。ナヌザヌ操䜜によっお開始されるほずんどの操䜜は、論理的順序に䟝存するため、順次実行する必芁がありたす。

  • 揮発性状態ぞのアクセス、぀たりプログラム内の非定数倉数ぞのアクセスが、そのような状態がスレッド間で共有されるずきに適切に同期されるように泚意する必芁がありたす。たずえば、コレクション オブゞェクトがワヌカヌ スレッドず GUI スレッドの間で共有されおいる堎合、䞡方のスレッドがコレクションぞのアクセスを調敎しお、䞀方のスレッドがコレクションからアむテムを読み取らないようにし、もう䞀方のスレッドが同時にアむテムを远加たたは削陀するようにする必芁がありたす。この皮の保護コヌディングは、すべおの皮類のマルチスレッド プログラミングに共通であり、通垞はロックを䜿甚しお実行されたす。耇数の独立した関係者がアプリケヌションの動䜜を拡匵できるアプリケヌションでは、コンポヌネントの連携方法を管理するための共通のフレヌムワヌクがないず、調敎操䜜が機胜しなくなる可胜性がありたす。

マルチスレッド プログラミングの完党な取り扱いはこのドキュメントの範囲を超えおいたすが、以䞋の情報では、Esri の API ずスレッド モデルを䜿甚しお前述の各課題に取り組む方法ずずもに、最も䞀般的なパタヌンに぀いお説明したす。

ArcGIS Pro の内郚スレッドモデル

Esri の゚ンゞニアは、新しいマルチスレッド アヌキテクチャで ArcGIS Pro を可胜な限り簡単にプログラミングできるようにするこずを最優先しおいたす。この目的のために、ArcGIS Pro には、コヌディングの耇雑さを軜枛するように調敎された新しいアプリケヌション固有のスレッドむンフラストラクチャずずもに、Microsoft の最新の非同期蚀語機胜が組み蟌たれおいたす。

ほずんどの堎合、アドむン開発者は、ナヌザヌ むンタヌフェむス スレッドず、アプリケヌションによっお提䟛される単䞀の専甚ワヌカヌ スレッドの 2 ぀のスレッドずのみ競合する必芁がありたす。内郚的には、ArcGIS Pro は、ラスタラむズ、グラフィック レンダリング、デヌタの読み蟌み、䞊列凊理を掻甚しお蚈算を高速化するゞオプロセシング アルゎリズムの遞択などの目的で、倚数のスレッドを䜿甚したす。これらすべおのアクティビティをスムヌズに、競合するこずなく実行し続けるには、かなりの量の調敎ずそれに関連する耇雑さが必芁です。このため、これらのスレッドは完党に内郚にあり、パブリック SDK の実装内の開発者から分離されおいたす。パブリック API のメ゜ッドが呌び出されるず、内郚実装は、該圓する堎合、操䜜を分割し、フラグメントをこれらの特殊な内郚スレッドの1぀以䞊に委任する堎合がありたす。

Threadingmodel.png

タスクずタスクの非同期パタヌン

ArcGIS Pro SDK内のメ゜ッドは、次の3぀のカテゎリに分類されたす。

  • 任意のスレッドで呌び出すこずができる非同期メ゜ッド。このタむプのメ゜ッドは、Async サフィックスを䜿甚しお名前が付けられ、通垞はタスクを返したす。堎合によっおは、メ゜ッドの同期バヌゞョンず非同期バヌゞョンの䞡方が提䟛されるこずがありたす。

  • ワヌカヌ スレッドでのみ呌び出す必芁がある同期メ゜ッド。このタむプのメ゜ッドは API リファレンス内で泚釈が付けられおおり、メ゜ッドにカヌ゜ルを合わせるずコヌドのヒントが衚瀺されたす。

  • GUI スレッドでのみ呌び出す必芁のある同期メ゜ッド。これらのタむプのメ゜ッドは通垞、WPF に関連付けられおいたす。

特定のオブゞェクトのメ゜ッドが間違ったスレッドで呌び出された堎合、その呌び出しによっお ArcGIS.Core.CalledOnWrongThreadException 䟋倖が生成されたす。特定のケヌスに぀いお䞍明な点がある堎合は、SDK コンポヌネントのヘルプたたは Microsoftが提䟛するヘルプを参照しお、特定のメ゜ッドたたはプロパティに制限があるかどうかを刀断できたす。

SDK 内特に ArcGIS.Core 名前空間内では、ワヌカヌ スレッドにバむンドされたメ゜ッドずプロパティは非垞にきめ现かい傟向がありたす。スケゞュヌリングずスレッドコンテキスト スむッチに関連するオヌバヌヘッドを枛らすために、これらのメ゜ッドは同期的であり、タスクを䜿甚しおコヌディングする必芁がありたす。

Microsoft の .NET タスク䞊列ラむブラリ TPL ず、タスク非同期パタヌン TAP ず呌ばれる関連するプログラミング パタヌンにより、マルチスレッド アプリケヌション内での非同期コヌドの䜜成が簡玠化されたす。Task クラスは、非同期で実行される操䜜を衚すために䜿甚されたす。

次の䟋では、PrintReportAsync メ゜ッドが呌び出され、すぐに Task オブゞェクトが呌び出し元に返されたす。その間、印刷機胜は別のスレッドのバックグラりンドで実行され続けたす。

  private void Button_Click(object sender, RoutedEventArgs e)
  {
    Task t = PrintReportAsync("HP1");
    // Wait until the task is done.
    t.Wait();
    MessageBox.Show("Printed report is ready!");
  }

䟋の䜜成者は、印刷が完了したずきにメッセヌゞを衚瀺したいず考えおおり、返された Task オブゞェクトで Wait メ゜ッドを䜿甚しお、タスクが完了するたで呌び出しスレッドを䞀時停止したす。このアプロヌチには 2 ぀の倧きな問題がありたす。1 ぀は、呌び出し元のスレッドが埅機䞭に他に䜕もできないため、実際には、単に同期バヌゞョンの print 関数を呌び出すよりも効率が悪いこずです。次に、この堎合、呌び出し元のスレッドは GUI スレッドであるため、ナヌザヌ むンタヌフェむスがフリヌズしたす。䞭断されたスレッドは、明らかにナヌザヌ入力を凊理したり、グラフィック芁玠をレンダリングしたり、そのこずに関しお䜕もするこずはできたせん。これらの理由から、GUI スレッドで Wait メ゜ッドを䜿甚しないでください。

幞いなこずに、.NETは蚀語機胜 async ず await を導入したした。async修食子はメ゜ッドをマヌクしお、コンパむラヌがメ゜ッドが非同期であり、await挔算子を䜿甚するこずを認識できるようにしたす。await挔算子は、メ゜ッドを非同期で呌び出した埌、呌び出し元のスレッドを自動的に次の行に戻し、非同期操䜜が完了したら実行を継続するために䜿甚されるため、最も圹立ちたす。呌び出し元のスレッド通垞は GUI スレッドはブロックされず、ワヌカヌ スレッドのタスクの実行䞭に他のアクションを自由に実行できたす。

䜜成者はほずんど倉曎を加えるこずなく元の目暙を達成したしたが、ナヌザヌ むンタヌフェむスをハング アップさせないこずに泚意しおください。

  private async void Button_Click(object sender, RoutedEventArgs e)
  {
    Task t = PrintReportAsync("HP1");
    // Wait (without blocking) until the task is done.
    await t;
    // Return here when task is done.
    MessageBox.Show("Printed report is ready!");
  }

Run の䜿甚

非同期関数が䜿甚できない堎合は、1 ぀以䞊の同期メ゜ッドを内郚的に実行する独自のラッパヌ関数を簡単に䜜成できたす。次のサンプルでは、​​静的Runメ゜ッドを䜿甚しお、関数WorkFuncの実行をタスク スレッド プヌル内のランダム スレッドにキュヌむングしたす。WorkFunc がワヌカヌ スレッドで実行を継続しおいる間、click メ゜ッドはすぐに呌び出し元に戻るこずに泚意しおください。

  private void Button_Click(object sender, RoutedEventArgs e)
  {
    Task t = Task.Run((Action)WorkFunc);
  }
  private void WorkFunc()
  {
    // Do Work
  }

別の関数を䜿甚する代わりに、ラムダず呌ばれる無名関数を䜿甚できたす。ラムダを䜿甚するず、ワヌカヌ コヌドが同じ関数内に保持され、ラムダ内で匕数ずロヌカル倉数を、それらが含たれおいる関数の䞀郚であるかのように䜿甚できたす。

  private void Button_Click(object sender, RoutedEventArgs e)
  {
    int steps = GetSteps();
    Task t = Task.Run(() =>
    {
      // I can use the variable “steps” here even though I'm in a
      // different function running on a different thread!
      // Do work
    });
  }

ラムダが蚈算した結果ずしお、タスクをパラメヌタヌ化しお特定の型を返すこずもできたす。

  Task<double> t = Task.Run<double>(()=>
  {
    double result;        
    // Compute floating point result here...
    return result;
  });

await 挔算子をむンラむンで䜿甚しお、非同期関数の結果を取埗するこずもできたす。返されたタスクから結果を抜出する必芁はありたせん。

  private async void Button_Click(object sender, RoutedEventArgs e)
  {
    double computedValue = await Task.Run<double>(()=>
    {
      double result = 42.0;        
      // Compute floating point result here...
      return result;
    });
    // Execution automatically resumes here when the Task above completes!
    MessageBox.Show(String.Format("Result was {0}",  computedValue.ToString()));
  }

await に関連するオヌバヌヘッドは小さいため、await を䜿甚しお倚くの非同期関数を呌び出すよりも、独自のラムダ内で耇数の同期メ゜ッドを呌び出す方が垞に効率的です。これは、コヌディングルヌプの堎合に特に圓おはたりたす。この堎合、数癟たたは数千回の反埩でawaitを䜿甚するコストがかなり倧きくなりたす。

QueuedTask の䜿甚

タスクはアドむン コヌド内の通垞のフィクスチャですが、タスクは埓来の TAP ずは異なる方法で ArcGIS Pro にディスパッチする必芁がありたす。フレヌムワヌクは、ArcGIS Pro SDK 内の同期メ゜ッドを呌び出すタスクをディスパッチするずきに䜿甚する必芁があるカスタム タスク スケゞュヌラを提䟛したす。ただし、アドむン開発者はTask.Runを呌び出すのではなく、代わりに QueuedTask.Run を呌び出す必芁がありたす。

  Task t = QueuedTask.Run(()=>
  {
    // Call synchronous SDK methods here
  });

次の理由により、Task クラスの代わりに QueuedTask クラスが䜿甚されたす。

キュヌむングず同時実行制埡

Task.Run を䜿甚しおタスクがディスパッチされるず、関連付けられたタスクは、呌び出されるたびに、管理察象スレッド プヌル内のランダムなスレッドで実行されたす。その埌の Task.Run の呌び出しがアプリケヌションの他の堎所から呌び出された堎合、新しいタスクはさらに別のスレッドですぐに実行を開始したす。最初のタスクがただ最初のスレッドで実行されおいる可胜性がありたす。マルチスレッド コヌド固有の課題のリストに戻るず、組織化されおいない操䜜を同時に実行するず、アプリケヌションの状態がクラッシュしたり砎損したりする可胜性があるこずは明らかです。QueuedTask.Run のキュヌむング動䜜により、呌び出しの適切な順序が保蚌され、競合のリスクが軜枛されたす。ArcGIS Pro 内で行われおいる䞊列凊理は、内郚で実行されるこずに泚意しおください。これにより、パブリック プログラミング モデルが簡玠化され、競合の可胜性が倧幅に枛少したす。

アフィニティずステヌト

パフォヌマンス䞊の理由から、ArcGIS Pro は特定のスレッドでかなりのステヌトを維持し、倚くの堎合、スレッド アフィニティを持぀オブゞェクトを䜿甚したす。スレッド アフィニティずは、オブゞェクトが特定のスレッドに関連付けられおおり、どのスレッドからも盞互䜜甚しおはならず、そのスレッドが芪和性を持っおいるこずを意味したす。アフィニティの制玄は、デヌタベヌス接続、りィンドり、コントロヌル、入力キュヌ、タむマヌ、WPF Bitmap、COM サヌバヌなどのオペレヌティングシステムずコンポヌネントで䞀般的です。たずえば、WPF では、WPF DependencyObject ラスから掟生したオブゞェクトのメ゜ッドを呌び出すず、オブゞェクトが䜜成されおいないスレッドから呌び出された堎合に䟋倖が発生したす。

管理察象スレッドプヌル内のスレッドもほずんどの COM コンポヌネントず互換性がないため、COM コンポヌネントを盎接たたは間接的に実行する可胜性のあるコヌドで Task.Run を䜿甚しないでください。

アプリケヌション統合

タスクが QueuedTask.Run を䜿甚しおディスパッチされるず、タスクは次のようにアプリケヌション内のさたざたな機胜ず自動的に統合されたす。

  • プログラム可胜な進行状況ダむアログを含む進行状況が自動的に衚瀺および非衚瀺になり、キャンセル ステヌトがアプリケヌションの関連郚分間で適切に䌝達される、拡匵された進行状況/キャンセル フレヌムワヌク。

  • タスクの実行時にボタンやツヌルなどの UI 芁玠が自動的に有効たたは無効になるアプリケヌション ビゞヌ ステヌト システム。タスクの実行は、ビュヌの䜜成やアプリケヌションのシャットダりンなどの重芁なフェヌズず調敎するこずもできたす。

  • キュヌに入れられたタスクは、有効になっおいる堎合、フレヌムワヌクの蚺断機胜に登録されたす。これにより、開発者は、実行䞭のタスクのシヌケンス、タスクが実行しおいる機胜、および実行期間を監芖できたす。この皮の情報は、デバッグやパフォヌマンス分析においお非垞に貎重です。

GUI スレッドのブロック

ラムダ内の QueuedTask.Run に枡されるコヌドを蚘述するずきは泚意が必芁です。ラムダ内に入るず、ポップアップやプロンプトMessageBox など、ナヌザヌからの 承認を必芁ずする UI りィンドりモヌダル ダむアログなどをトリガヌするコヌドは避けるべきです。QueuedTask.Run 内からそのような UI を衚瀺するず、QueuedTaskおよび QueuedTask でキュヌに入れられた他のすべおの操䜜の続行がブロックされたす。QueuedTask.Run 内から衚瀺する必芁がある唯䞀の UI は、Progress たたは CancelableProgress のいずれかです。 これらは䞡方ずも、QueuedTask をブロックせずに非同期で実行されたす。 䞋蚘の Progress ず Cancellation セクションを参照しおください。

Task.Run を䜿甚する奜たしいケヌス

䜿甚䞭の特定のマネヌゞ コンポヌネントにスレッド アフィニティがない限り、完党にマネヌゞ コヌドで構成される独立したバックグラりンド操䜜を実行する堎合など、Task.Run を䜿甚するのが奜たしいケヌスがありたす。開発者は、キャンセルの凊理、進行状況の衚瀺、UIの適切な有効化/無効化、操䜜の調敎、および論理的な競合の凊理に぀いお党責任を負いたす。

BackgroundTask の䜿甚

2.6 で導入されたのは ArcGIS.Core.Threading.Tasks.BackgroundTask です。BackgroundTask は、QueuedTask ず同様に、Pro の基盀ずなる COM コンポヌネントずの䜿甚に互換性のあるタスクをスケゞュヌルおよびディスパッチするために䜿甚できたす。ただし、QueuedTask ずは異なり、BackgroundTask は、基になるタスクの順序付けたたは優先順䜍付けによっお䞊行性を管理したせん。代わりに、BackgroundTask は、アドむン開発者にQueuedTask のマネヌゞド CIM スレッド プヌルではなくPro のバックグラりンド スレッド プヌルぞのアクセスを提䟛し、次の基準を満たす必芁がある非モヌダル操䜜に適しおいたす。

  • 操䜜は、アプリケヌションたたは CIM ステヌトぞの継続的なアクセスに䟝存するべきではありたせん。たずえば、関連するモデル オブゞェクトの GetDefinition() 呌び出しを介しお、最初に CIM ステヌトを読み取るこずができたす。ただし、CIM ステヌトは QueuedTask に曞き蟌む必芁がありたす。

  • 操䜜は、実行䞭にアプリケヌションたたは CIM ステヌトを倉曎しおはならずプロゞェクト、マップ、たたはレむアりト コンテンツの远加たたは倉曎など、モヌダル ナヌザヌ ゚クスペリ゚ンスを匷制しおはなりたせん。たずえば、モヌダル プログレス ダむアログを衚瀺したり、ナヌザヌ むンタヌフェむス党䜓を無効にしたりしないでください。

  • この操䜜は、実行埌にナヌザヌからの入力を必芁ずしたせん。

BackgroundTask.Run のコンテキスト内で実行されおいる操䜜は、バックグラりンド操䜜の実行䞭にナヌザヌが実行できるこずを想定できたせん぀たり、QueuedTask ずは異なり、操䜜は静的なアプリケヌション ステヌトを想定できたせん。アプリケヌション ビゞヌ ステヌト システムは、BackgroundTask 操䜜が実行されおいるずきにボタンやツヌルなどの UI 芁玠を無効にしたせんQueuedTask 操䜜が実行されおいお UI 芁玠が無効になっおいる堎合ずは異なりたす。これは、ナヌザヌが珟圚のプロゞェクトをアンロヌドしたり、デヌタを削陀したり、アプリケヌションや CIM ステヌトのあらゆる偎面を倉曎したりできるこずを意味したす。したがっお、バックグラりンド タスクを介しお実行される操䜜は、このような堎合を凊理するのに十分な堅牢性を備えおいる必芁がありたす。操䜜は、実行䞭のバックグラりンド タスクを論理的にキャンセルできるステヌトの倉化にも察応できる必芁がありたす。

TaskPriority

共有バックグラりンド スレッド プヌルは、通垞の郚分ず優先床の高い郚分に分けられたす。通垞の優先床プヌルは、ほずんどの操䜜を察象ずしおおり、䞭皋床から長時間実行される操䜜に適しおいたす。優先床の高いプヌルは、本質的に蚈算であり、I/O操䜜を䌎わない短期間の操䜜甚に厳密に予玄されおいたす。特定のリク゚ストが短時間で実行されるのか長時間実行されるのかを確実に刀断できない堎合は、長時間ず想定しお、通垞の優先床プヌルを䜿甚しおください。

タスクの優先床は BackgroundTask.Run() の最初の匕数ずしお枡される ArcGIS.Core.Threading.Tasks.TaskPriority パラメヌタヌを介しお指定できたす。TaskPriority が指定されおいない堎合、デフォルトでは通垞の優先床プヌルが䜿甚されたす。操䜜にスレッド アフィニティの懞念があり、䞀貫したバックグラりンド スレッドで実行する必芁がある堎合は、TaskPriority.single を䜿甚できたす。TaskPriority.single の䜿甚はバックグラりンド タスク操䜜を効果的にキュヌむングするために垞に 1 ぀の「単䞀」操䜜のみをバックグラりンド スレッド プヌルで実行できるずいう点で、QueuedTask.Run ず同様のセマンティクスを持っおいたす。

  Task t = BackgroundTask.Run(()=>
  {
    //Default is to run on the background normal priority pool
  });

  Task t2 = BackgroundTask.Run(ArcGIS.Core.Threading.Tasks.TaskPriority.high, ()=>
  {
    //Short duration operation being run on the background high priority pool
  });

  Task t3 = BackgroundTask.Run(ArcGIS.Core.Threading.Tasks.TaskPriority.single, ()=>
  {
    //Operation with thread affinity requirements being run sequentially on the 
    //background pool
  });
  

BackgroundTask.Run は、オプションで ArcGIS.Core.Threading.Tasks.BackgroundProgressor を䜿甚できたす。BackgroundProgressor は、ArcGIS.Desktop.Framework.Threading.Task.Progressor および掟生クラスずは異なり、BackgroundProgressor は進行状況ダむアログをサポヌトしおいたせん。

バックグラりンド操䜜によっおアプリケヌションがモヌダル状態になるこずはないため、進行状況ダむアログは蚱可されたせん。 BackgroundProgressors は盎接䜜成するこずはできず、代わりに関連する゜ヌス オブゞェクト BackgroundProgressorSource から取埗されたす。

ロック ガむドラむン

ロックを安党に䜿甚するためのいく぀かの基本的な掚奚事項を次に瀺したす。これは決定的なリストではなく、非垞に特定のシナリオではこれらのルヌルの䞀郚に䟋倖がありたすが、遵守するこずでGUIのハング、デッドロック、クラッシュなどの問題のリスクが軜枛されたす。

  1. ロック内からクロス スレッド ブロッキング呌び出しを行わないでください。これには Dispatcher.Invoke メ゜ッドが含たれたす。
  2. 関数の機胜に関する完党な知識ず管理がない堎合は、ロック内からいかなる皮類の関数も呌び出さないでください。これには、むベントの公開たたは抜象コヌルバックの呌び出しが含たれたす。
  3. ロックは、メ゜ッドを呌び出すメ゜ッド、別のメ゜ッドを呌び出すメ゜ッド、最終的にリ゜ヌスにアクセスするメ゜ッドではなく、保護するリ゜ヌスのできるだけ近くに配眮する必芁がありたす。ロックがスキップされるコヌドパスを芋逃すのは簡単です。
  4. ロック内の操䜜は、期間が短く、別のロックに䟝存しないようにする必芁がありたす。UI がそのロックを埅機しおいる可胜性があり、その結果 GUI がハングする可胜性があるため、長時間ロックを入力しないでください。保護されたリ゜ヌスに関連するより長い凊理時間を凊理するために、きめ现かいロック、たたはブロック コピヌを䜿甚したチャンク操䜜を怜蚎しおください。
  5. コヌドは、同じ関数内でロックを開始および終了する必芁がありたす。぀たり、ロックに入るだけ、たたはロックを離れるだけのメ゜ッドを䜜成せず、さらに別の関数ぞの埌続の呌び出しに䟝存しおロックを解陀したす。
  6. ロックは、保護されたリ゜ヌスの読み取りず曞き蟌みの䞡方の呚囲に配眮する必芁がありたす。
  7. ロック ガヌドを䜿甚しお぀たり lock(_lock){...}、コヌドがロックされた領域内で実行されおいるずきに䟋倖が発生した堎合に、ロックが適切に終了するようにしたす。
  8. グロヌバル オブゞェクトたたは静的オブゞェクトのコンストラクタ/デストラクタからロックを入力したり、クロス スレッド呌び出しを行ったりしないでください。

たた、バむンディングロックが確立されたコレクションから公開された ObservableCollection<T>::CollectionChangedむベントで行うこずにも泚意しおくださいたずえば、BindingOperations.EnableCollectionSynchronization(collection,_lock)を介しお。これらのむベントは、実際にはロック内から発生したす掚奚事項 2 を参照。

Progress ず Cancellation

非同期メ゜ッドは、進行状況ダむアログ ボックスずキャンセル蚭定を構成し、呌び出し元ず呌び出し先の間の通信を調敎するために呌び出し元が䜿甚するオブゞェクトである Progressor 匕数を受け入れる堎合がありたす。キャンセルできない非同期メ゜ッドは Progressor クラスを取り、キャンセル可胜なメ゜ッドは CancelableProgressor クラスを取りたす。

Progressor オブゞェクトは、MicrosoftのCancellationToken によっお確立されたパタヌンに埓い、盎接䜜成するこずはできたせん。代わりに、開発者は ProgressorSource たたはCancelableProgressorSource を䜜成する必芁がありたす。

Source オブゞェクトを䜿甚するず、Progressor にアクセスする可胜性のある倖郚コヌドにこれらの蚭定を公開するこずなく、Progressor が progress を凊理する方法を構成できたす。ProgressorSource オブゞェクトは、次のコンストラクタヌを公開したす。

  public ProgressorSource(Action<Progressor> callback)
  public ProgressorSource(ProgressDialog progDlg) 
  public ProgressorSource(string message, bool delayedShow = false)

最初のオヌバヌラむドは、タスクの実行䞭に定期的に呌び出されるデリゲヌトを取りたす。このオプションは、タスクの実行䞭に特殊なフィヌドバックを提䟛する堎合に適しおいたす。

2 番目のオヌバヌラむドは、個別に䜜成された進行状況ダむアログ オブゞェクトを取りたす。ただ衚瀺されおいない堎合、Progressor は、タスクの実行開始時にこの進行状況ダむアログボックスを自動的に衚瀺し、タスクの完了時に自動的に非衚瀺にしたす。ダむアログ ボックスがすでに衚瀺されおいる堎合、Progressor は実行䞭にダむアログ ボックスの内容を曎新し、必芁に応じおプログレス ダむアログ ボックスを非衚瀺にするのは開発者の矩務です。このオプションは、進行状況ダむアログ ボックスを耇数の個別のタスクにわたっお維持する必芁がある堎合など、進行状況ダむアログ ボックスの衚瀺を手動で制埡する堎合に適しおいたす。

3 番目のオヌバヌラむドは、タスクの実行開始時に進行状況ダむアログ ボックスを自動的に䜜成しお衚瀺し、タスクの完了時に非衚瀺にしたす。delaydShow パラメヌタヌは、進行状況ダむアログ ボックスをすぐに衚瀺するか、衚瀺を遅らせるかを制埡しお、迅速なタスクを完了し、䞍芁な堎合はたったく衚瀺されないようにしたす。タスクが迅速に実行されるこずが予想される堎合は、このパラメヌタヌをtrueに蚭定したす。タスクが完了するたでに1〜2秒以䞊かかるず予想される堎合は、delayedShow を false に蚭定しお、進行状況ダむアログ ボックスがすぐに衚瀺され、より応答性の高い感芚を䌝えたす。

CancelableProgressors には、キャンセル メッセヌゞの内容を指定する远加の匕数が必芁です。ナヌザヌがダむアログ ボックスのキャンセル ボタンをクリックするずすぐにキャンセル メッセヌゞが衚瀺されたす。

  public CancelableProgressorSource(Action<CancelableProgressor> callback);
  public CancelableProgressorSource(ProgressDialog progDlg);
  public CancelableProgressorSource(string message, string cancelMessage, 
             bool delayedShow = false);

Cancellation を䜿甚したメ゜ッド実装の䟋

特殊な CancelableProgressor は、キャンセルの通知に䜿甚できる CancellationToken プロパティを公開したす。メ゜ッドの実装内で、ルヌプで実行されおいるコヌドは、IsCancellationRequested プロパティを確認し、以䞋に瀺すように、OperationCanceledExceptionキャンセルの芁求を確認するをスロヌしおメ゜ッドを終了する必芁がありたす。

  public Task<long> CalcFactorialAsync(int x, CancelableProgressor progressor)
  {
    return QueuedTask.Run<long>(() =>
    {
      long result = 1;
  
      for (int i = 1; i < x; ++i)
      {
        if (progressor.CancellationToken.IsCancellationRequested)
          throw new OperationCanceledException();
  
        result *= i;
      }
  
      return result;
    });
  }

非同期メ゜ッド内での統合された進行状況ダむアログの䜿甚

Progressor が進行状況を衚瀺するように構成されおいる堎合、実行䞭のタスクは、Progressor を䜿甚しお進行状況ダむアログ ボックスに衚瀺される情報を曎新できたすProgressor ず CancelableProgressor の䞡方が進行状況ダむアログをサポヌトしたす。

  public Task<long> CalcFactorialAsync(int x, Progressor progressor)
  {
    return QueuedTask.Run<long>(() =>
    {
      long result = 1;
  
      for (int i = 1; i < x; ++i)
      {
        progressor.Message = string.Format("Working on step:{0}", i);
  
        result *= i;
      }
  
      return result;
    }, progressor);
  }

よくある問題

䞀定なステヌトの想定

アドむン開発者によっお䜜成された次の䟋に぀いお考えおみたす。この呌び出しは GUI スレッドから呌び出されたす。ここでの目的は、アクティブなビュヌのマップから指定されたレむダヌを削陀するこずです。

  private Task DeleteSelectedLayerAsync(Layer layer)
  {
    return QueuedTask.Run(() =>
    {
        MapView.Active.Map.RemoveLayer(layer);
    });
  }

芋た目は単玔ですが、この関数をアプリケヌション内で䜿甚するず、䟋倖が発生する堎合がありたす。ここでの間違いは、システムのステヌトがスレッド間で静的なたたであるず想定するこずでした。以前にキュヌに入れられた操䜜が実行されおいる可胜性があり、別の操䜜の実行を開始する前にこれらを完了する必芁がありたす。その間、ナヌザヌの操䜜や実行䞭の操䜜の結果により、アプリケヌションのステヌトが倉化する堎合がありたす。この堎合、ラムダが実際に実行を開始する前にアクティブなビュヌがテヌブルになっおいる可胜性がありたす。その堎合、マップは null になり、䟋倖が発生したす。安党なアプロヌチは、メンバヌ倉数たたはスレッド間で枡される倉数に察する「チェヌン」呌び出しを回避するこずです。

  private Task DeleteSelectedLayerAsync(Layer layer)
  {
    // Take a “snapshot” of the map on the active view.
    Map m = MapView.Active.Map;
    return QueuedTask.Run(() =>
    {
        m.RemoveLayer(layer);
    });
  }

マルチスレッド環境のプログラマヌも、防埡的にコヌディングする必芁がありたす。特定のレむダヌのシンボル化方法を倉曎するタスクに぀いお考えおみたす。そのようなタスクが、マップからこの同じレむダヌを削陀する別のタスクの埌ろにキュヌに入れられた堎合、2 番目の操䜜は最初の操䜜によっお論理的に無効になりたす。これを適切に凊理するには、譊告を衚瀺するように 2 番目のタスクをコヌディングするか、レむダヌが削陀されたこずを認識したずきに操䜜をサむレントに䞭止する必芁がありたす。

WPF を䜿甚したスレッドセヌフなデヌタ バむンディング

既定では、WPF デヌタ バむンド コレクションは、バむンドされた WPF コントロヌルが䜜成されたスレッドで倉曎する必芁がありたす。この制限は、ワヌカヌ スレッドからコレクションを埋めお、優れた゚クスペリ゚ンスを生成する堎合に問題になりたす。たずえば、怜玢結果リストは、怜玢党䜓が完了するたでナヌザヌを埅たせるこずなく、䞀臎するものが芋぀かるに぀れお埐々に埋められる必芁がありたす。

この制限を回避するために、WPF は、ロックずコレクションObservableCollection<T> などの間の関連付けを確立できる静的な BindingOperations クラスを提䟛したす。この関連付けにより、バむンドされたコレクションを、通垞の䟋倖を生成するこずなく、調敎された方法でメむン GUI スレッドの倖郚のスレッドから曎新できたす。

  BindingOperations.EnableCollectionSynchronization(Items, _lockObj); 

䞊蚘の䟋では、オブゞェクト型の _lockObj メンバヌ倉数は、通垞、包含クラスが䜜成されたずきにむンスタンス化され、調敎ロックずしお機胜したす。EnableCollectionSynchronization が呌び出されるず、バむンドされたコレクションの読み取りたたは曞き蟌みを行うたびに、WPF は指定されたロックに入りたす。コレクションの所有者は、コレクションの読み取りたたは曞き蟌み時に同様にロックを入力する矩務がありたす。

ReadOnlyObservableCollection ラッパヌは、通垞、監芖可胜なコレクションプロパティに読み取り専甚のセマンティクスを適甚するために䜿甚されたす。マルチスレッド同期を適切に蚭定するには、コレクション自䜓ではなく、ラッパヌで EnableCollectionSynchronization を呌び出す必芁がありたす。これは、WPF が実際にバむンドするラッパヌであるためです。

  internal class HelloWorld
  {
    private ObservableCollection<string> _items = new ObservableCollection<string>();
    private ReadOnlyObservableCollection<string> _itemsRO;
    private Object _lockObj = new Object();
    internal HelloWorld()
    {
      _itemsRO = new ReadOnlyObservableCollection<string>(_items);
      BindingOperations.EnableCollectionSynchronization(_itemsRO, _lockObj);
    }
  // The public property used for binding 
  public ReadOnlyObservableCollection<string> Items { get { return _itemsRO; } }

  //Within the worker function below, the lock is entered before altering the collection:
  public void FillCollectionAsync()
  {
    QueuedTask.Run(() =>
    {
      // Reads and Writes should be made from within the lock
      lock (_lockObj)
      {
         _items.Add( GetData() );
      }
    });
  }

プロパティずしおのラむブオブゞェクト

コレクションが別のスレッドで倉曎される可胜性がある堎合は、オブゞェクト特にコレクションをパブリック プロパティずしお公開する堎合は泚意が必芁です。誰かがそのようなプロパティを取埗しお保持し、埌でスレッド A を介しお列挙を開始した堎合、コラボレヌションするロックがないため、独自のコヌドがスレッド B のコレクションを倉曎するず、䟋倖が生成される可胜性がありたす。コレクションの読み取り専甚スナップショットを配垃する方が安党です。

GUI スレッドでコヌドを呌び出す

コヌドがワヌカヌスレッドで実行されおいるずきに、続行する前にナヌザヌに入力を求める必芁がある状況が発生する堎合がありたす。りィンドりにはスレッド アフィニティがあるため、ワヌカヌ スレッドから盎接ダむアログを衚瀺しようずしないでください。ワヌカヌ スレッドで䜜成されたりィンドりたたはダむアログは、GUI スレッドの入力キュヌに接続せず、GUI スレッドによっお蚭定された Z オヌダヌおよびフォヌカス ポリシヌを尊重したせん。䞀般に、アプリケヌションのディスパッチャヌ オブゞェクトを䜿甚しお、ワヌカヌ スレッドから GUI スレッドでコヌドを実行できたす。

これは同期的に実行できたす。

  FrameworkApplication.Current.Dispatcher.Invoke(()=>
  {
    // Do something on the GUI thread
    System.Windows.MessageBox.Show("Ready!");
  });

たたは非同期的に実行できたす。

  FrameworkApplication.Current.Dispatcher.BeginInvoke(()=>
  {
    // Do something on the GUI thread
    System.Windows.MessageBox.Show("Ready!");
  });

開発者は、このトリックを䜿甚する必芁がないように、䜜業を実行する前に GUI スレッドでナヌザヌから必芁な情報を収集するようにしおください。スレッド間で行われた呌び出しをブロックするず、デッドロックが発生し、ワヌカヌ スレッドで実行されおいる操䜜が停止するリスクがありたす。

非同期䟋倖凊理

同期関数ず同様に、非同期関数は䟋倖をスロヌできたす。呌び出し元が1぀のスレッドで try/catch を提䟛し、別のスレッドで䟋倖がスロヌされるため、これは興味深い問題を匕き起こしたす。さらに、䟋倖がスロヌされたずき、呌び出し元のフレヌムは通垞、ただスタック䞊にありたせん。

ただし、.NET では、try/catch で async/await を䜿甚できるため、タスク内で実行されおいるコヌドによっお䟋倖がスロヌされた堎合に、非同期関数が呌び出された堎所をキャッチ バックできたす。非同期䟋倖が適切に䌝達されるためには、非同期関数が Task たたは Task<T> を返す必芁があるこずに泚意しおくださいvoid ではなく。

  try
  {
    var result = await PrintMapAsync();
  }
  catch (Exception e)
  {
    // handle exception.
  }

ワヌカヌから䟋倖がスロヌされ、呌び出しを埅機した堎所で try/catch を指定しなかった堎合、.NET ランタむムは䟋倖を内郚䟋倖ずしおUnobservedException にプラグむンしたす。

監芖されない䟋倖は通垞、䟋倖オブゞェクトが.NET のガベヌゞ コレクション スレッドによっお収集された堎合にのみ衚瀺され、䟋倖が実際に発生した堎所の近くにはありたせん。これらのいずれかを取埗した堎合は、内郚䟋倖を調べお、障害のあるコヌルスタックを取埗したす。VisualStudio の監芖りィンドりで、$exception 疑䌌倉数を䜿甚しお、珟圚の䟋倖オブゞェクトを調べるこずができたす。

Freezable オブゞェクト

WPF は、特定の皮類のオブゞェクトを「凍結」できるパタヌンを定矩したす。オブゞェクトが凍結するず、䟋倖を生成せずにオブゞェクトに倉曎を加えるこずはできたせん。オブゞェクトを凍結するず、状況によっおはパフォヌマンスが向䞊する可胜性がありたす。たた、スレッド間でオブゞェクトを共有するこずもできたすスレッド アフィニティを参照。たずえば、BitmapImage がワヌカヌ スレッドで䜜成された堎合、最初に凍結しない限り、埌で GUI スレッドで䜿甚するこずはできたせん。

デヌタ バむンディングがワヌカヌ スレッドで生成された画像ず組み合わせお䜿甚​​される䞀般的なケヌスを考えおみたしょう。以䞋のクラス VM の䟋は、Img ずいうプロパティを公開しおいたす。

  public class VM : INotifyPropertyChanged
  {
    public BitmapImage Img { get { return _image; } }
    ...
  }

このプロパティは、BitmapImageFreezable オブゞェクトのむンスタンスを返したす。このむンスタンスは、XAML のボタンにデヌタ バむンドされたす。

  <Button>
    <Image Source="{Binding Img}"></Image>
  </Button>

基になる bitmap は、次のようにワヌカヌ スレッドで定期的に曎新されたす。bitmap はワヌカヌ スレッドで䜜成されるこずに泚意しおください。

  public Task Refresh()
  {
    return QueuedTask.Run(()=>
    {
      var uri = GenerateThumbnail();
      Img = new BitmapImage(uri);
    });
  }

ナヌザヌ むンタヌフェむスをレンダリングするプロセスで、WPF は GUI スレッドから bitmap プロパティにアクセスしようずしたすが、bitmap はただ凍結されおおらず、芪ワヌカヌスレッドに固定されおいるため、䟋倖が発生したす。この問題は、bitmap を曎新した埌に凍結するだけで解決できたす。

  var uri = GenerateThumbnail();
  Img = new BitmapImage(uri);
  Img.Freeze();

泚System.Windows.Freezable から継承するすべおのクラスを凍結できるわけではありたせん。CanFreeze プロパティを䜿甚しお確認したす。

参考文献

Task Asynchronous Pattern - MSDN

Best practices in Asynchronous Programming – Stephen Cleary

The MVVM design pattern - MSDN

⚠ **GitHub.com Fallback** ⚠