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
ãããã¯
- ã¢ãã€ã³ã®æ¡åŒµæ§ãã€ã³ã
- æ§æ
- ãã©ã°ã€ã³ ããŒã¿ãœãŒã¹
- ããŒã«ã« ã¢ãã€ã³ VS å ±æ ã¢ãã€ã³
- ã¢ãã€ã³ ã€ã³ã¹ããŒã«æã«ãšã³ã ãŠãŒã¶ãŒäœ¿çšèš±è«Ÿå¥çŽæžïŒEULAïŒã衚瀺ãã
- DAMLïŒDesktop Application Markup LanguageïŒã®æŠèŠ
- Daml èŠçŽ
- ããã¯ã¹ããŒãž
- ã³ã³ãã ã³ã³ãããŒã«
- ã³ã³ãããŒã«
- ãããã³ã° ãã€ã³
- ãã€ã³
- ãããã㣠ã·ãŒããšããŒãž
- ã¿ããšã°ã«ãŒã
- ããŒã«ããŒ
- ã³ãã³ãã®æ€çŽ¢
- UI ã³ã³ãããŒã«
- XAML ã¢ã€ã³ã³
- Runtime API
- ã¢ãã€ã³ ã¡ã¿ããŒã¿
- ã€ãã³ã
- RelayCommand
- ã©ã€ã»ã³ã¹ã®ãã§ã㯠ã€ã³ãšãã§ã㯠ã¢ãŠã
- Undo/Redo ãã¬ãŒã ã¯ãŒã¯
- ãã©ãã° ã¢ã³ã ãããã
- éç¥
- 蚺æã¢ãŒãïŒã€ãã³ã ãã°ïŒ
- ArcGIS Pro ã§ã®ãã«ãã¹ã¬ããã®æäœ
- Progress ãš Cancellation
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# ã§ã®ã¿æäŸããŸãã
ã«ã¹ã¿ã ãã©ã°ã€ã³ ããŒã¿ãœãŒã¹ã¯ãå®å šã« .NET ã«å®è£ ãããŠããŸããããã㯠.esriPlugin æ¡åŒµåãæã¡ã1 ã€ã®äŸå€ãé€ããŠããéåžžã®ãPro ã¢ãã€ã³ãšåãæ¢ç¥ã®ãã©ã«ããŒã®å Žæã«ãããã€ãããŸããPro ã¢ãã€ã³ã¯ããŒãžã§ã³ã®ãªããArcGISProããã©ã«ããŒã«ã³ããŒãããŸãããããã©ã«ãã®ãã©ã°ã€ã³å±éãã©ã«ããŒã¯ããŒãžã§ã³ç®¡çãããŠããŸãïŒArcGISPro2.4ãArcGISPro2.5ãArcGISPro2.6 ãªã©ïŒããã ãããã©ã°ã€ã³ã«ã¯éåžžã®ã¢ãã€ã³ãšåãèªã¿èŸŒã¿ç¹æ§ããããŸããããšãã°ã以åã®ããŒãžã§ã³ã¯æ°ããããŒãžã§ã³ã® Pro ã«ãã£ãŠèªã¿èŸŒãŸããPro ã¢ã»ã³ããªåç §ã¯èªåçã«è»¢éãããææ°ããŒãžã§ã³ã®ãã©ã°ã€ã³ãåªå ãããŸããããŒãžã§ã³ç®¡çãããããã©ã«ãã®ãããã€ã¡ã³ã ãã©ã«ããŒã¯ããã©ã°ã€ã³ã Pro ã«ããŒããããæ¹æ³ã®ç¹ç°æ§ã§ãã
ãã©ã°ã€ã³ã¯ 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 ã¢ãã€ã³ ãããžã§ã¯ãããšãããšã©ãŒãçºçããŸãã
ãã©ã°ã€ã³èªäœã®äžã§ã¯ã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 ãµã³ãã«ãåç
§ããŠãã ããã
ãŠãŒã¶ãŒã®ããã©ã«ã ã¢ãã€ã³ ãã©ã«ã㌠(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 ãã¡ã€ã«å ã§å®çŸ©ãããŸããããšãã°ãã¢ãã€ã³ã¯ããããã³ã° ãã€ã³ãš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 ãåç §ããŠãã ããã
ã¢ãžã¥ãŒã«ã¯ã«ãŒã 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 ã¢ããªã±ãŒã·ã§ã³ã®ããã¯ã¹ããŒãžã®[ã©ã€ã»ã³ã¹]ã¿ãã«å€éšãšã¯ã¹ãã³ã·ã§ã³ãšããŠè¡šç€ºãããŸãã
ãŠãŒã¶ãŒãããã¯ã¹ããŒãžããæ§æå¯èœãªãšã¯ã¹ãã³ã·ã§ã³ãæå¹ã«ããããšãããšããµãŒãããŒãã£ã®éçºè 㯠IExtensionConfigïŒ10.xãšåãïŒãä»ããŠã«ã¹ã¿ã ã©ã€ã»ã³ã¹ ã³ãŒããå®è¡ããæå¹åã¢ã¯ã·ã§ã³ãèš±å¯ãããŠãããã©ãããå€æã§ããŸãã
ã¢ãã€ã³ã®æ§æå¯èœãªãšã¯ã¹ãã³ã·ã§ã³ã®å®è£ ã¯ã2段éã®ããã»ã¹ã§ãã
- Config.daml ãã¡ã€ã«ã®
<insertModule ...></insertModule>
èŠçŽ å ã«<extensionConfig .../>
èŠçŽ ãè¿œå ããŸãã -
IExtensionConfigModule
ã¯ã©ã¹ã«å®è£ ããŸãïŒãªãã·ã§ã³ ãå¿ é ã§ã¯ãããŸããïŒã
<extensionConfig .../>
DAMLèŠçŽ ã¯ãããªãã®ã¢ãã€ã³ã®ã©ã€ã»ã³ã¹ ã¿ãå€éšãšã¯ã¹ãã³ã·ã§ã³ ãªã¹ã ãšã³ããªã®å
容ãå¶åŸ¡ããŸãã補ååãšã¡ãã»ãŒãžã¯ãIExtensionConfig å®è£
å
ã§åçã«æŽæ°ã§ããŸãïŒã¹ããŒã¿ã¹ã瀺ããªã©ïŒã補ååãšã¡ãã»ãŒãžã¯ãïŒãªã¹ã ãšã³ããªã®ïŒæå¹ãªãã§ã㯠ããã¯ã¹ãã¯ãªãã¯ããããã³ã«æŽæ°ãããŸãã
ããšãã°ã以äžã«ç€ºã DAML ã¯ã次ã®å€éšãšã¯ã¹ãã³ã·ã§ã³ ãªã¹ã ãšã³ããªã«ãªããŸãã
extensionConfig hasExtendedInfo
å±æ§ã true ã«èšå®ãããŠããããšã«æ³šæããŠãã ãããããã¯ã¢ãã€ã³ãã¢ãã€ã³ ã¢ãžã¥ãŒã«ã« IExtensionConfig
ãå®è£
ãããŠããããšã Pro ã«éç¥ããŸããhasExtendedInfo
å±æ§ã true ã«èšå®ããªããšãã¢ãã€ã³ ã¢ãžã¥ãŒã«ã® IExtensionConfig
å®è£
ã¯ãã¹ãŠç¡èŠãããŸããDAML ã® <extensionConfig ... hasExtendedInfo="false"/>
èŠçŽ ãæã€ã¢ãã€ã³ã¯ã[ã©ã€ã»ã³ã¹]ã¿ãã«æ°žç¶çã«æå¹ã«ãªã£ãŠãããã®ãšããŠäžèŠ§è¡šç€ºãããŸãïŒç¡å¹ã«ããããšã¯ã§ããŸããïŒã
IExtensionConfig
å®è£
ã«ã€ããŠã¯ãProGuide License Your Add-in ã§è©³ãã説æãããŠããŸãã
ããã©ã«ãã§ã¯ãã¢ãã€ã³ ã¢ãžã¥ãŒã«ã¯ JIT ã§ããŒããããŸãïŒ<modules><insertModule .... autoLoad="false">...
ïŒãæ§æå¯èœãªãšã¯ã¹ãã³ã·ã§ã³ã§ããã¢ãã€ã³ã JIT ã§ããŒãã§ããèªåããŒãããå¿
èŠã¯ãããŸããïŒã€ãŸã autoLoad="true"
ïŒãJIT ãããŒããããã¢ãã€ã³ã¯ãã¢ã¯ãã£ãåããããšãã«ã«ã¹ã¿ã ã®æå¹åïŒãŸãã¯ã©ã€ã»ã³ã¹ïŒããžãã¯ãå®è£
ããŸããã¢ã¯ãã£ããŒã·ã§ã³ã¯æ¬¡ã®å Žåã«çºçããŸãã
- ã«ã¹ã¿ã UI ã³ã³ããŒãã³ãã®ããããã UIïŒãã¿ã³ãã¿ããªã©ïŒãã¯ãªãã¯ããããã衚瀺ãããŸãïŒãããã³ã° ãã€ã³ããã€ã³ãªã©ïŒ
- 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
ã®ãããªïŒå®çŸ©æžã¿ã«ããŽãªã®ã»ãããå«ãŸããŠããŸãããéçºè
ã¯ç¬èªã®ã«ããŽãªãäœæããããšãã§ããŸãã
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 ã¯ãã©ã®ã³ãã³ããã©ã®ã«ããŽãªã«ç»é²ãããŠãããã«ãã£ãŠãããŸããŸãªã¡ãã¥ãŒãšãªãã·ã§ã³ãåçã«æ§æã§ããŸãã
ç¹å®ã®ã«ããŽãªã§ã¯ãã«ããŽãªã®åå è
ã <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 ã«ãããŸã)
ã³ãã³ã㯠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
ã§ã¢ã¯ãã£ãåããããšããã®åã蟌ã¿å¯èœãªã³ã³ãããŒã«ãç·šéã«ãã£ãŠã¢ã¯ãã£ãåããããŠãŒã¶ãŒã¯ç¹å®ã®ãããã¡è·é¢ãå
¥åã§ããããã«ãªããŸãã
éçºè ã¯ã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 ãŠã£ã³ããŠãæ§æããããã®ã«ã¹ã¿ã ã«ããŽãªã®å®è£ ã瀺ããŠããŸãã
ããã¯ã¹ããŒãžã¯ãã¢ããªã±ãŒã·ã§ã³ãšçŸåšã®ãããžã§ã¯ãã®è¿œå æ©èœãå ¬éãããã« ã¹ã¯ãªãŒã³ã®ãŠãŒã¶ãŒ ã€ã³ã¿ãŒãã§ã€ã¹ ãã¥ãŒã§ããããã¯ã¹ããŒãžã¯ã¿ããšãã¿ã³ã§æ§æãããŠããŸããåã¿ãã¯ç¹å®ã®ã¿ã¹ã¯ã«ã¹ã³ãŒããããç¬èªã®ãŠãŒã¶ãŒ ã€ã³ã¿ãŒãã§ã€ã¹ã衚瀺ããŸãããã¿ã³ã¯ãæäœãå®è¡ããåãªãã³ãã³ãã§ãããããã¯ã¹ããŒãžã«è¿œå ã®ãŠãŒã¶ãŒ ã€ã³ã¿ãŒãã§ã€ã¹ã¯ãããŸããã
ããã¯ã¹ããŒãžã®ã¿ããç¶æ³ã«å¿ããŠè¡šç€ºãããæºããããŠããªãã³ã³ãã£ã·ã§ã³ãæå®ãããšç¡å¹ã«ãªããŸãã
ãã€ã³ããããã³ã° ãã€ã³ãããã³ãããã㣠ããŒãžãšåæ§ã«ãã«ã¹ã¿ã ã®ããã¯ã¹ããŒãž ã¿ãã«ã¯ã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次å é åã«å¶çŽãããããªãå Žåã«æé©ã§ãã
次ã®ç»åã¯ãããŒã¹ãããã®ãããã ããŠã³ ã®ã£ã©ãªãŒã瀺ããŠããŸãã
ã®ã£ã©ãªãŒã¯ãã€ã³ã©ã€ã³ ã®ã£ã©ãªãŒè¡šçŸã䜿çšããŠããªãã³äžã«åçž®ãããã°ãªããã衚瀺ã§ããŸãããã®æ¹æ³ã§æ瀺ãããã¢ã€ãã ã¯ãå®è£ ã«å¿ããŠãæãäžè¬çãªã¢ã€ãã ãŸãã¯æè¿äœ¿çšãããã¢ã€ãã ã®ããããã§ããããšããããããŸãã次ã®ç»åã¯ãã¬ã€ã€ãŒ ãã³ãã¬ãŒãã®ã€ã³ã©ã€ã³ ã®ã£ã©ãªãŒã瀺ããŠããŸãã
ã®ã£ã©ãªãŒã®å®éã®ã³ã³ãã³ãã¯ãå®è¡æã«å ¥åãããŸãããã£ãã·ã§ã³ããããã ããŠã³ ã€ã¡ãŒãžãã¢ã€ãã ãµã€ãºã®å¶çŽãããŒã« ããããªã©ã®æ¯èŒçéçãªåŽé¢ã¯ã宣èšçã«æå®ãããŸãã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ã€ã§ããã³ã³ããã¹ã ã¡ãã¥ãŒããããã¢ãããããšããã£ãã·ã§ã³ã®æåã®æåã«äžç·ãåŒãããŸããããŒãæŒããããšã察å¿ããã³ãã³ããèµ·åãããŸããåãã³ã³ããã¹ã ã¡ãã¥ãŒã®é ç®ã«å¯ŸããŠã㌠ããããå®çŸ©ããå Žåã¯ãè¡çªãé¿ããã¹ãã§ããããšã«æ³šæããŠãã ããã
<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ãïŒããã³ã³ããã¹ãïŒãéžæããããã®ãïŒã«ã¢ã¯ã»ã¹ã§ããŸãã[ã³ã³ãã³ã]ãã€ã³ã«ã¯ãããããšã·ãŒã³ã®ã³ã³ããã¹ãã®ã¿ã衚瀺ãããŸããã¬ã€ã¢ãŠã ã³ã³ããã¹ãã¯çŸåšãµããŒããããŠããŸããã
ã«ã¿ãã° ã³ã³ããã¹ããååŸããã«ã¯ãæåã«ãã¬ãŒã ã¯ãŒã¯ ã¢ããªã±ãŒã·ã§ã³ããã¢ã¯ãã£ã ãŠã£ã³ããŠãååŸããŸããããã¯ãçŸåšãã©ãŒã«ã¹ããããããã³ã° ãã€ã³ãŸãã¯ãã¥ãŒ ãã€ã³ã®ããããã«ãªããŸãããŠã£ã³ããŠã 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>
ãã¬ããã«ãªã¹ããããŠããæåã®ããŒã«ã¯ãããã«ã«è¡šç€ºãããæåã®ããŒã«ã§ãã
åå²ãã¿ã³ã¯ãé¢é£ãããã¿ã³ãã°ã«ãŒãåããŸããåå²ãã¿ã³ã®ç¢å°éšåãã¯ãªãã¯ãããšãé¢é£ããã°ã«ãŒãã衚瀺ãããŸãããªã¹ããããŠããæåã®ãã¿ã³ã¯ãã³ã¬ã¯ã·ã§ã³ã§æãäžè¬çã«äœ¿çšãããŠãããã¿ã³ã§ããããªãã³ã«çŽæ¥è¡šç€ºãããŸããæ®ãã®ãã¿ã³ã¯ããŸã䜿çšãããŠãããããããã ããŠã³ ã¡ãã¥ãŒã«è¿œå ãããŸããåå²ãã¿ã³ã¯çŽç²ã«å®£èšåã§ãããé¢é£ããã¢ã¯ã·ã§ã³éšåã¯ãããŸãããã³ã³ãããŒã«ã«åå ããŠããåãã¿ã³ã«ã¯ã¢ã¯ãã£ããªéšåããããŸãããåå²ãã¿ã³èªäœã¯ãããŸããã
ããããããŠã³ ãªã¹ãããã³ã³ãããŒã«ãéžæããããšããã®ã³ã³ãããŒã«ãã¹ããªãã ãã¿ã³ã®ã¢ã¯ãã£ã ã³ã³ãããŒã«ã«ãªããŸããã¹ããªãã ãã¿ã³ã«ã¯ãã·ã³ãã«ãªãã¿ã³ ã³ã³ãããŒã«ãã¡ãã¥ãŒããã€ããã㯠ã¡ãã¥ãŒãã®ã£ã©ãªãŒã®ãããããå«ããããšãã§ããŸãã
<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>
ããŸã䜿çšãããªããã¿ã³ã®ã³ã¬ã¯ã·ã§ã³ã®ä»£ããã«ãåå²ãã¿ã³ã§ã®ã£ã©ãªãŒã衚瀺ã§ããŸããæåã®èŠçŽ ã¯ãŸã ãã¿ã³ã§ããåŸã§èŠãããã«ãã®ã£ã©ãªãŒã¯ããã«ç¬èªã®ãã¿ã³ã¡ãã¥ãŒã衚瀺ã§ããŸãã
<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 ã€ã®ãã¿ã³ïŒèµ€ãåè§ïŒã瀺ããŠããŸãã
<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>
ãã¿ã³ã¯ã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"/>
ã¹ãã㌠ã³ã³ãããŒã«ã¯ãç·šéããã¯ã¹ã®ããã§ãããã€ã³ã¯ãªã¡ã³ã ãã¿ã³ãšãã¯ãªã¡ã³ã ãã¿ã³ãè¿œå ã§æäŸãã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="°">
<tooltip image="Images\Angle16.png" heading="Rotate">Specify rotation angle
<disabledText>No item selected.</disabledText>
</tooltip>
</spinner>
ã¹ãã㌠ã³ã³ãããŒã«ã¯ãã¹ãã㌠åºåºã¯ã©ã¹ãã掟çããããšã«ãã£ãŠå®è£ ãããŸãã
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 ã€ã ãã§ããã¢ã¯ãã£ããªãã€ã³ã¯ããªãã³ã§äœ¿çšã§ãããã®ã確ç«ããŸããç°ãªããã€ã³ãåãæ¿ãããšã䜿çšå¯èœãªã¿ããšã³ã³ãããŒã«ãå€æŽãããå¯èœæ§ããããŸããã¢ã¯ãã£ããªãã€ã³ã¯ããã€ã§ããŠãŒã¶ãŒãæäœããŠãããã®ãè¡šããŸãããããã£ãŠãã¢ããªã±ãŒã·ã§ã³ã®ãã©ã€ã㪠ã³ã³ããã¹ããæäŸããŸããåæã«å€ãã®ãã€ã³ãéãããšãã§ãããããã¯ã°ã«ãŒãåãã¿ã€ã«åïŒæ°Žå¹³ãŸãã¯åçŽïŒããŸãã¯ãããŒãããããšãã§ããŸã(ãã ããã€ã³ã¿ã©ã¯ãã£ããªæäœã®ã¿)ã
ãã€ã³ã¯ããã€ã³ ã³ã¬ã¯ã·ã§ã³èŠçŽ å ã§å®£èšãããŸãã
<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";
ãããã㣠ã·ãŒãã«ã¯ãé¢é£ã®ãªãåã ã®ãããã㣠ããŒãžã®ã³ã¬ã¯ã·ã§ã³ãå«ãŸããŠããŸããåããŒãžã«ã¯ãé¢é£ããããããã£ã®ã°ã«ãŒããèšå®ããããã®ã³ã³ãããŒã«ãå«ãŸããŠããŸãããããã㣠ã·ãŒãã¯ãã¢ãŒãã«ãŸãã¯ã¢ãŒãã¬ã¹ã§è¡šç€ºã§ããŸãã
ããã©ã«ãã§ã¯ãããããã£ã·ãŒãã¯ããããåºæã®ãµã€ãºãšäœçœ®ãæã¡ãŸããã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 ã§å®£èšçã«æ§æãããŸããé »ç¹ã«äœ¿çšããã³ã³ãããŒã«ã¯å€§ãããŠãããããããã®ã«ããå¿ èŠããããŸãããããŸã䜿çšããªãããŒã«ã¯å°ããããå¿ èŠããããŸããããã«ãã³ã³ãããŒã«ã¯éåžžãæ©èœãããæ確ã«ããããã«ãã£ãã·ã§ã³ãšãã¢ã«ãªã£ãŠããŸãã
ã°ã«ãŒãã¯ããªãã·ã§ã³ã§ããã€ã¢ãã° ã©ã³ãã£ãŒããã¿ã³ïŒã°ã«ãŒã ãã£ãã·ã§ã³ã®æšªã«ããå°ããªãªã³ã¯ ãŠã£ãžã§ããïŒããµããŒãã§ããŸãããã®ãã¿ã³ã¯ãèŠããªãæ©èœã«ã¢ã¯ã»ã¹ã§ãããã€ã¢ãã° ããã¯ã¹ã衚瀺ããããã«äœ¿çšãããŸããããã¯ã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ã€ã®ã¿ããå«ãã¿ã ã°ã«ãŒãããããŸãã
ã¿ã ã°ã«ãŒãã¯ã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
Medium
Small
ã°ã«ãŒãå ã§è€æ°ã®ãµãã°ã«ãŒãã宣èšã§ããŸãã
<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>
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">
...
ãªãã³ ã°ã«ãŒãã¯ãããŒã«ããŒãžã®ã³ã³ãããŒã«ã®å éšã³ã¬ã¯ã·ã§ã³/ã°ã«ãŒãåããµããŒãããŸããããŒã« ããŒã¯çŽç²ã«å®£èšåã§ããããã®å®çŸ©ã¯ããªãã³ã§äœ¿çšå¯èœãªã¹ããŒã¹ã®éã«å¿ããŠããŒã« ããŒãã©ã®ããã«èŠãããã瀺ããŸããããŒã« ããŒã¯ã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ããã£ãã·ã§ã³ããŸãã¯ããŒã« ãããã¯ãã³ãã³ãæ€çŽ¢ã³ã³ãããŒã«ã®æ€çŽ¢æååãšããŠäœ¿çšã§ããŸãã
ã³ãã³ãæ€çŽ¢çµæã«ã³ãã³ãã衚瀺ãããªãããã«ããã«ã¯ã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 ãåç §ããŠãã ããã
ã¯ãªãã¯ãŸãã¯ã¿ãã§ã³ãã³ãæ€çŽ¢ã³ã³ãããŒã«å ã«æåã«ãã©ãŒã«ã¹ã移åãããšãæè¿äœ¿çšããã³ãã³ããšææ¡ãããã³ãã³ãã®è€åãªã¹ãã衚瀺ãããŸãããªã¹ããããŠãããµãžã§ã¹ãé ç®ã¯ãçŸåšã¢ã¯ãã£ããªã¿ãã«ãã£ãŠç°ãªããŸãã
ãµãžã§ã¹ããããã³ãã³ãã®ãªã¹ãã¯ãã¢ããªã±ãŒã·ã§ã³ã眮ãããŠããç¶æ ã«ããé©åã«èª¿æŽããããªã¹ããæäŸããããã«ã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" };
}
}
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>
å圢ã¢ãã¡ãŒã·ã§ã³ ã³ã³ãããŒã« ã¯ãåçŽãªã¢ãã¡ãŒã·ã§ã³ ã³ã³ãããŒã«ã§ããç°ãªãéæ床ã®åã®èŒªã§ãããªã³ã°ãå転ããããšã¢ãã¡ãŒã·ã§ã³ãçºçããŸãã
xmlns:controls="clr-namespace:ArcGIS.Desktop.Framework.Controls;assembly=ArcGIS.Desktop.Framework"
<controls:CircularAnimationControl Foreground="Maroon" SpeedRatio="0.5" Visibility="Visible"/>
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 ãã¿ã³ ã³ã³ãããŒã« ã¯ãã·ã³ãã«ãªããŒã« ãããã衚瀺ããã詳现æ å ±ããã¿ã³ã§ãã
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"/>
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" />
æ€çŽ¢ããã¹ãããã¯ã¹ ã³ã³ãããŒã« ã¯ãªãã·ã§ã³ã®æ€çŽ¢å±¥æŽã¡ãã¥ãŒãæäŸãã 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"/>
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" />
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 ã®ã«ã¹ã¿ã åŸ æ©ã€ã³ãžã±ãŒã¿ãŒ ã³ã³ãããŒã«ã§ããã¢ãã¡ãŒã·ã§ã³ã¯ãã³ã³ãããŒã«ãããŒãããããšéå§ããé衚瀺ãŸãã¯ã¢ã³ããŒãããããšåæ¢ããŸãã
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 ã³ã³ãããŒã« ã«ãããŸãã
é«è§£å床ã¢ãã¿ãŒãããé©åã«ãµããŒãããããã«ãã©ã¹ã¿ãŒãããã¯ããã«åªããã¹ã±ãŒãªã³ã°ãè¡ããããArcGIS Pro ã¯ãã¯ã¿ãŒ ã¢ã€ã³ã³ ã€ã¡ãŒãžïŒxamlïŒã䜿çšããŠããªãã³ã«ã³ã³ãã³ãã衚瀺ããŸããé«è§£å床ã¢ãã¿ãŒã¯ã䜿çšå¯èœãªå Žåã¯åžžã« xaml ã¢ã€ã³ã³ã䜿çšããŸãããäœè§£å床ã¢ãã¿ãŒã¯ãã¹ã±ãŒãªã³ã°ã 125 ïŒ ä»¥äžã«èšå®ãããŠããå Žåãxaml ã¢ã€ã³ã³ã䜿çšããŸããã¢ãã€ã³éçºè ã¯ãéåžžã©ãããArcGIS Pro ãªãã³ã® UI ã³ã³ãããŒã«ã®ã¢ã€ã³ã³ãšã㊠pngïŒã©ã¹ã¿ãŒïŒç»åãåŒãç¶ã䜿çšã§ããŸãã
次ã®æé ã§ã¯ãäŸãšã㊠DAML <button ...>
ã䜿çšããŠããªãã³ã®ã¢ãã€ã³ã§ãã¯ã¿ãŒ xaml ã¢ã€ã³ã³ã䜿çšããæ¹æ³ã«ã€ããŠèª¬æããŸããå®å
šãªäŸã¯ã XAML-Icons ãµã³ãã«
ã«ãããŸãã
- ãã¯ã¿ãŒ ããŒã¹ã® xaml ã¢ã€ã³ã³ãšããŠã¢ã€ã³ã³ãäœæããŸããäŸïŒXAML-Icons ãµã³ãã« ã® EvilGenius16.xaml ãš EvilGenius32.xamlããããã¯ãArcGIS Pro ã®ãªãã³ã®ã«ã¹ã¿ã ãã¿ã³ã§äœ¿çšããã¢ã€ã³ã³ã§ããArcGIS Pro ã®æè²ããŒããšæ·¡è²ããŒãããµããŒãããã«ã¯ã2 ã€ã®ããŒãžã§ã³ã® xaml ã¢ã€ã³ã³ãå¿ èŠã§ãã
- æè²ããŒãã® xaml ã¢ã€ã³ã³ã DarkImages ãã©ã«ããŒã«è¿œå ããŸããæ·¡è²ããŒãã® xaml ã¢ã€ã³ã³ã Images ãã©ã«ããŒã«è¿œå ããŸãïŒVisual Studio ã®ã¢ãã€ã³ãŸãã¯æ§æãããžã§ã¯ãã«ã¯ Images ãã©ã«ããŒãš DarkImages ãã©ã«ããŒã®äž¡æ¹ãå«ãŸããŸãïŒãäœè§£å床ã®ã·ããªãªããµããŒãããã«ã¯ãéåžžã® png ãè¿œå ããå¿ èŠããããŸãã
- ãããã® xaml ãã¡ã€ã«ã®ãã«ã ã¢ã¯ã·ã§ã³ ããããã£ããContentãã«èšå®ããŸãã
- ãããžã§ã¯ãã® 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 ã¢ã€ã³ã³ãå«ãŸããŠããããããã¿ã³ã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšãããŠããããŒãã®æ£ããã¢ã€ã³ã³ãèªåçã«è¡šç€ºãããŸãã
ïŒæå®ãããã»ãã·ã§ã³ã®ïŒãã¹ãŠã®ãããŒããããã¢ãã€ã³ã®ã¡ã¿ããŒã¿ãåãåããããå Žåã¯ã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);
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);
}
}
次ã®ãããªã¡ãã»ãŒãž ããã¯ã¹ã衚瀺ãããŸããæ£ç¢ºãªå 容ã¯ãåã ã®åæã©ã€ã»ã³ã¹èšå®ã«ãã£ãŠæ±ºå®ãããŸãã
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 ã€ä»¥äžã®ç¹å®ã®ã³ã³ãããŒã«ã«éå®ããã«ã¯ã
- config.daml ã®ãããã³ã° ãã€ã³å®£èšã§
isDropTarget = false
ãèšå®ããŸãã - ããããããµããŒããããããã³ã° ãã€ã³ã®åã³ã³ãããŒã«ã«ãã¢ã¿ãããããããããã£
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 ãŠã£ã³ããŠèªäœãŸãã¯ãã®äžã® 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;
ã«ã¹ã¿ã ãããã ãã³ãã©ãŒã 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);
ã¯ã€ã㯠ã¢ã¯ã»ã¹ ããŒã«ããŒïŒQATïŒã¯ãã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠæå®ãããããŸãã¯ãŠãŒã¶ãŒã«ãã£ãŠéžæãããã³ãã³ãã®ã³ã¬ã¯ã·ã§ã³ãå ¬éãããå°ããã«ã¹ã¿ãã€ãºå¯èœãªããŒã«ããŒã§ããããŒã«ããŒã¯ããã©ã«ãã§ã¢ããªã±ãŒã·ã§ã³ã®å·Šäžé ã«è¡šç€ºãããŸããããŠãŒã¶ãŒã¯ãªãã³ã®äžã«ç§»åã§ããŸããQAT ã«ã¯ããŠãŒã¶ãŒãããŒã«ããŒã®ã³ãã³ããé衚瀺ïŒãŸãã¯è¡šç€ºïŒã§ãããã« ããŠã³ ã¡ãã¥ãŒããããŸãã
QAT ã¯ãã¯ã€ã㯠ã¢ã¯ã»ã¹ ããŒã«ããŒã®ã«ã¹ã¿ãã€ãº QAT ã¡ãã¥ãŒãä»ããŠã€ã³ã¿ã©ã¯ãã£ãã«å€æŽãããŸãã[ãã®ä»ã®ã³ãã³ã...] ãéžæãããšããããžã§ã¯ã ãªãã·ã§ã³ ãããã㣠ããŒãžãéããQAT ã«è¿œå ããè¿œå ã®ã³ãã³ããéžæããããæ¢åã®ã³ãã³ããåé€ãããã§ããŸãã
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 ãåç
§ããŠãã ããã
ãã®ã³ãŒãäŸã§ã¯ããããžã§ã¯ã ã¬ãã«ã®éç¥ã¢ã€ãã ãšãéç¥ã¢ã€ãã ãã¯ãªãã¯ããããšãã®ã«ã¹ã¿ã ããªã²ãŒã
ãäœæããŸããéç¥é
ç®ãã¯ãªãã¯ãããšãããªã²ãŒããåŒã³åºãããŸãïŒãã®ç¹å®ã®ã±ãŒã¹ã§ã¯ã¡ãã»ãŒãž ããã¯ã¹ã衚瀺ãããŸãïŒã
//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ã¯ãè€æ°ã®å®è¡ã³ã¢ãåããææ°ã®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 ãšã¹ã¬ãã ã¢ãã«ã䜿çšããŠåè¿°ã®å課é¡ã«åãçµãæ¹æ³ãšãšãã«ãæãäžè¬çãªãã¿ãŒã³ã«ã€ããŠèª¬æããŸãã
Esri ã®ãšã³ãžãã¢ã¯ãæ°ãããã«ãã¹ã¬ãã ã¢ãŒããã¯ãã£ã§ ArcGIS Pro ãå¯èœãªéãç°¡åã«ããã°ã©ãã³ã°ã§ããããã«ããããšãæåªå ããŠããŸãããã®ç®çã®ããã«ãArcGIS Pro ã«ã¯ãã³ãŒãã£ã³ã°ã®è€éãã軜æžããããã«èª¿æŽãããæ°ããã¢ããªã±ãŒã·ã§ã³åºæã®ã¹ã¬ããã€ã³ãã©ã¹ãã©ã¯ãã£ãšãšãã«ãMicrosoft ã®ææ°ã®éåæèšèªæ©èœãçµã¿èŸŒãŸããŠããŸãã
ã»ãšãã©ã®å Žåãã¢ãã€ã³éçºè ã¯ããŠãŒã¶ãŒ ã€ã³ã¿ãŒãã§ã€ã¹ ã¹ã¬ãããšãã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠæäŸãããåäžã®å°çšã¯ãŒã«ãŒ ã¹ã¬ããã® 2 ã€ã®ã¹ã¬ãããšã®ã¿ç«¶åããå¿ èŠããããŸããå éšçã«ã¯ãArcGIS Pro ã¯ãã©ã¹ã¿ã©ã€ãºãã°ã©ãã£ã㯠ã¬ã³ããªã³ã°ãããŒã¿ã®èªã¿èŸŒã¿ã䞊ååŠçã掻çšããŠèšç®ãé«éåãããžãªããã»ã·ã³ã° ã¢ã«ãŽãªãºã ã®éžæãªã©ã®ç®çã§ãå€æ°ã®ã¹ã¬ããã䜿çšããŸããããããã¹ãŠã®ã¢ã¯ãã£ããã£ãã¹ã ãŒãºã«ã競åããããšãªãå®è¡ãç¶ããã«ã¯ãããªãã®éã®èª¿æŽãšããã«é¢é£ããè€éããå¿ èŠã§ãããã®ããããããã®ã¹ã¬ããã¯å®å šã«å éšã«ããããããªã㯠SDK ã®å®è£ å ã®éçºè ããåé¢ãããŠããŸãããããªã㯠API ã®ã¡ãœãããåŒã³åºããããšãå éšå®è£ ã¯ã該åœããå Žåãæäœãåå²ãããã©ã°ã¡ã³ãããããã®ç¹æ®ãªå éšã¹ã¬ããã®1ã€ä»¥äžã«å§ä»»ããå ŽåããããŸãã
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!");
}
éåæé¢æ°ã䜿çšã§ããªãå Žåã¯ã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ã䜿çšããã³ã¹ããããªã倧ãããªããŸãã
ã¿ã¹ã¯ã¯ã¢ãã€ã³ ã³ãŒãå ã®éåžžã®ãã£ã¯ã¹ãã£ã§ãããã¿ã¹ã¯ã¯åŸæ¥ã® 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ã®é©åãªæå¹å/ç¡å¹åãæäœã®èª¿æŽãããã³è«ççãªç«¶åã®åŠçã«ã€ããŠå šè²¬ä»»ãè² ããŸãã
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ã®ãã³ã°ããããããã¯ãã¯ã©ãã·ã¥ãªã©ã®åé¡ã®ãªã¹ã¯ã軜æžãããŸãã
- ããã¯å
ããã¯ãã¹ ã¹ã¬ãã ããããã³ã°åŒã³åºããè¡ããªãã§ãã ãããããã«ã¯
Dispatcher.Invoke
ã¡ãœãããå«ãŸããŸãã - é¢æ°ã®æ©èœã«é¢ããå®å šãªç¥èãšç®¡çããªãå Žåã¯ãããã¯å ãããããªãçš®é¡ã®é¢æ°ãåŒã³åºããªãã§ãã ãããããã«ã¯ãã€ãã³ãã®å ¬éãŸãã¯æœè±¡ã³ãŒã«ããã¯ã®åŒã³åºããå«ãŸããŸãã
- ããã¯ã¯ãã¡ãœãããåŒã³åºãã¡ãœãããå¥ã®ã¡ãœãããåŒã³åºãã¡ãœãããæçµçã«ãªãœãŒã¹ã«ã¢ã¯ã»ã¹ããã¡ãœããã§ã¯ãªããä¿è·ãããªãœãŒã¹ã®ã§ããã ãè¿ãã«é 眮ããå¿ èŠããããŸããããã¯ãã¹ããããããã³ãŒããã¹ãèŠéãã®ã¯ç°¡åã§ãã
- ããã¯å ã®æäœã¯ãæéãçããå¥ã®ããã¯ã«äŸåããªãããã«ããå¿ èŠããããŸããUI ããã®ããã¯ãåŸ æ©ããŠããå¯èœæ§ãããããã®çµæ GUI ããã³ã°ããå¯èœæ§ããããããé·æéããã¯ãå ¥åããªãã§ãã ãããä¿è·ããããªãœãŒã¹ã«é¢é£ããããé·ãåŠçæéãåŠçããããã«ããã现ããããã¯ããŸãã¯ããã㯠ã³ããŒã䜿çšãããã£ã³ã¯æäœãæ€èšããŠãã ããã
- ã³ãŒãã¯ãåãé¢æ°å ã§ããã¯ãéå§ããã³çµäºããå¿ èŠããããŸããã€ãŸããããã¯ã«å ¥ãã ãããŸãã¯ããã¯ãé¢ããã ãã®ã¡ãœãããäœæãããããã«å¥ã®é¢æ°ãžã®åŸç¶ã®åŒã³åºãã«äŸåããŠããã¯ã解é€ããŸãã
- ããã¯ã¯ãä¿è·ããããªãœãŒã¹ã®èªã¿åããšæžã蟌ã¿ã®äž¡æ¹ã®åšå²ã«é 眮ããå¿ èŠããããŸãã
- ãã㯠ã¬ãŒãã䜿çšããŠïŒã€ãŸã
lock(_lock){...}
ïŒãã³ãŒããããã¯ãããé åå ã§å®è¡ãããŠãããšãã«äŸå€ãçºçããå Žåã«ãããã¯ãé©åã«çµäºããããã«ããŸãã - ã°ããŒãã« ãªããžã§ã¯ããŸãã¯éçãªããžã§ã¯ãã®ã³ã³ã¹ãã©ã¯ã¿/ãã¹ãã©ã¯ã¿ããããã¯ãå ¥åããããã¯ãã¹ ã¹ã¬ããåŒã³åºããè¡ã£ããããªãã§ãã ããã
ãŸãããã€ã³ãã£ã³ã°ããã¯ã確ç«ãããã³ã¬ã¯ã·ã§ã³ããå
¬éããã ObservableCollection<T>::CollectionChanged
ã€ãã³ãã§è¡ãããšã«ã泚æããŠãã ããïŒããšãã°ãBindingOperations.EnableCollectionSynchronization(collection,_lock)
ãä»ããŠïŒããããã®ã€ãã³ãã¯ãå®éã«ã¯ããã¯å
ããçºçããŸãïŒæšå¥šäºé
2 ãåç
§ïŒã
éåæã¡ãœããã¯ãé²è¡ç¶æ³ãã€ã¢ãã° ããã¯ã¹ãšãã£ã³ã»ã«èšå®ãæ§æããåŒã³åºãå ãšåŒã³åºãå ã®éã®éä¿¡ã調æŽããããã«åŒã³åºãå ã䜿çšãããªããžã§ã¯ãã§ãã 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);
ç¹æ®ãª 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