ArcGIS Pro SDK (四)框架 2

ArcGIS Pro SDK 框架 2

目录

  • [ArcGIS Pro SDK 框架 2](#ArcGIS Pro SDK 框架 2)
    • [18 访问当前主题](#18 访问当前主题)
    • [19 显示Pro消息框](#19 显示Pro消息框)
    • [20 添加吐司通知](#20 添加吐司通知)
    • [21 更改按钮标题或图像](#21 更改按钮标题或图像)
    • [22 获取按钮的工具提示标题](#22 获取按钮的工具提示标题)
    • [23 订阅活动工具更改事件](#23 订阅活动工具更改事件)
    • [24 进度器 - 简单且不可取消](#24 进度器 - 简单且不可取消)
    • [25 进度器 - 可取消](#25 进度器 - 可取消)
    • [26 自定义按钮或工具的 disabedText 属性](#26 自定义按钮或工具的 disabedText 属性)
    • [27 从当前程序集获取图像资源](#27 从当前程序集获取图像资源)
    • [28 阻止 ArcGIS Pro 关闭](#28 阻止 ArcGIS Pro 关闭)
    • [29 如何在 MapView 中定位可嵌入控件](#29 如何在 MapView 中定位可嵌入控件)
    • [30 激活选项卡时命令搜索中建议的命令选项。](#30 激活选项卡时命令搜索中建议的命令选项。)
    • [31 从命令行启动 ArcGIS Pro](#31 从命令行启动 ArcGIS Pro)
    • [32 获取命令行参数](#32 获取命令行参数)
    • [33 应用程序加速器(快捷键)](#33 应用程序加速器(快捷键))
    • [34 使用专业样式在 DAML 中定义控件](#34 使用专业样式在 DAML 中定义控件)

18 访问当前主题

csharp 复制代码
// 获取应用程序的主题
var theme = FrameworkApplication.ApplicationTheme;
// 主题
if (FrameworkApplication.ApplicationTheme == ApplicationTheme.Dark)
{
  // 黑暗主题
}

if (FrameworkApplication.ApplicationTheme == ApplicationTheme.HighContrast)
{
  // 高对比度
}
if (FrameworkApplication.ApplicationTheme == ApplicationTheme.Default)
{
  // 明亮/默认主题
}

19 显示Pro消息框

csharp 复制代码
ArcGIS.Desktop.Framework.Dialogs.MessageBox.Show("Some Message", "Some title", MessageBoxButton.YesNo, MessageBoxImage.Information, MessageBoxResult.Yes);

20 添加吐司通知

csharp 复制代码
Notification notification = new Notification();
notification.Title = FrameworkApplication.Title;
notification.Message = "Notification 1";
notification.ImageUrl = @"pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/ToastLicensing32.png";

ArcGIS.Desktop.Framework.FrameworkApplication.AddNotification(notification);

21 更改按钮标题或图像

csharp 复制代码
private void ChangeCaptionImage()
{
  IPlugInWrapper wrapper = FrameworkApplication.GetPlugInWrapper("MyAddin_MyCustomButton");
  if (wrapper != null)
  {
    wrapper.Caption = "new caption";

    // 确保T-Rex16和T-Rex32包含在你的插件中的images文件夹下,并设置生成`操作 = 资源`和`复制到输出目录 = 不复制`
    wrapper.SmallImage = BuildImage("T-Rex16.png");
    wrapper.LargeImage = BuildImage("T-Rex32.png");
  }
}

private ImageSource BuildImage(string imageName)
{
  return new BitmapImage(PackUriForResource(imageName));
}

private Uri PackUriForResource(string resourceName)
{
  string asm = System.IO.Path.GetFileNameWithoutExtension(
      System.Reflection.Assembly.GetExecutingAssembly().Location);
  return new Uri(string.Format("pack://application:,,,/{0};component/Images/{1}", asm, resourceName), UriKind.Absolute);
}

22 获取按钮的工具提示标题

csharp 复制代码
// 传入按钮的daml id。或者传入任何Pro按钮ID。
IPlugInWrapper wrapper = FrameworkApplication.GetPlugInWrapper("button_id_from daml");
var buttonTooltipHeading = wrapper.TooltipHeading;

23 订阅活动工具更改事件

csharp 复制代码
private void SubscribeEvent()
{
  ArcGIS.Desktop.Framework.Events.ActiveToolChangedEvent.Subscribe(OnActiveToolChanged);
}
private void UnSubscribeEvent()
{
  ArcGIS.Desktop.Framework.Events.ActiveToolChangedEvent.Unsubscribe(OnActiveToolChanged);
}
private void OnActiveToolChanged(ArcGIS.Desktop.Framework.Events.ToolEventArgs args)
{
  string prevTool = args.PreviousID;
  string newTool = args.CurrentID;
}

24 进度器 - 简单且不可取消

csharp 复制代码
public async Task Progressor_NonCancelable()
{
  ArcGIS.Desktop.Framework.Threading.Tasks.ProgressorSource ps = new ArcGIS.Desktop.Framework.Threading.Tasks.ProgressorSource("Doing my thing...", false);

  int numSecondsDelay = 5;
  // 如果您在调试器中运行此程序,则不会看到对话框
  await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() => Task.Delay(numSecondsDelay * 1000).Wait(), ps.Progressor);
}

25 进度器 - 可取消

csharp 复制代码
public async Task Progressor_Cancelable()
{
  ArcGIS.Desktop.Framework.Threading.Tasks.CancelableProgressorSource cps =
    new ArcGIS.Desktop.Framework.Threading.Tasks.CancelableProgressorSource("Doing my thing - cancelable", "Canceled");

  int numSecondsDelay = 5;
  // 如果您在调试器中运行此程序,则不会看到对话框

  // 模拟做一些可以取消的工作
  await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() =>
  {
    cps.Progressor.Max = (uint)numSecondsDelay;
    // 每秒钟检查一次
    while (!cps.Progressor.CancellationToken.IsCancellationRequested)
    {
      cps.Progressor.Value += 1;
      cps.Progressor.Status = "Status " + cps.Progressor.Value;
      cps.Progressor.Message = "Message " + cps.Progressor.Value;

      if (System.Diagnostics.Debugger.IsAttached)
      {
        System.Diagnostics.Debug.WriteLine(string.Format("RunCancelableProgress Loop{0}", cps.Progressor.Value));
      }
      
      if (cps.Progressor.Value == cps.Progressor.Max) break;
      // 阻塞一秒钟
      Task.Delay(1000).Wait();

    }
    System.Diagnostics.Debug.WriteLine(string.Format("RunCancelableProgress: Canceled {0}",
                                        cps.Progressor.CancellationToken.IsCancellationRequested));

  }, cps.Progressor);
}

26 自定义按钮或工具的 disabedText 属性

csharp 复制代码
// 在config.daml中将工具的loadOnClick属性设置为"false"。
// 这将允许在Pro启动时创建工具,以便disabledText属性可以在启动时显示自定义文本。
// 从工具中删除"condition"属性。使用下面的OnUpdate方法设置工具的启用/禁用状态。
// 添加OnUpdate方法到工具中。
// 注意:由于OnUpdate调用非常频繁,您应该避免在此方法中进行冗长的操作
// 因为这将降低应用程序用户界面的响应性。
internal class SnippetButton : ArcGIS.Desktop.Framework.Contracts.Button
{
  protected override void OnUpdate()
  {
    bool enableSate = true; //TODO: 编写你的启用状态
    bool criteria = true;  //TODO: 评估disabledText的标准

    if (enableSate)
    {
      this.Enabled = true;  // 工具已启用
    }
    else
    {
      this.Enabled = false;  // 工具已禁用
                             // 在这里自定义你的disabledText
      if (criteria)
        this.DisabledTooltip = "Missing criteria 1";
    }
  }
}

27 从当前程序集获取图像资源

csharp 复制代码
public static void ExampleUsage()
{
  // 图片` Dino32.png `,并设置生成`操作 = 资源`和`复制到输出目录 = 不复制`
  var img = ForImage("Dino32.png");
  // 使用图片...
}

public static BitmapImage ForImage(string imageName)
{
  return new BitmapImage(PackUriForResource(imageName));
}
public static Uri PackUriForResource(string resourceName, string folderName = "Images")
{
  string asm = System.IO.Path.GetFileNameWithoutExtension(
      System.Reflection.Assembly.GetExecutingAssembly().Location);
  string uriString = folderName.Length > 0
      ? string.Format("pack://application:,,,/{0};component/{1}/{2}", asm, folderName, resourceName)
      : string.Format("pack://application:,,,/{0};component/{1}", asm, resourceName);
  return new Uri(uriString, UriKind.Absolute);
}

28 阻止 ArcGIS Pro 关闭

csharp 复制代码
// 有两种方法可以防止ArcGIS Pro关闭
// 1. 覆盖加载项模块上的CanUnload方法并返回false。
// 2. 订阅ApplicationClosing事件,并在收到它时取消该事件

internal class Module1 : Module
{

  // 在ArcGIS Pro关闭时被框架调用
  protected override bool CanUnload()
  {
    // 返回false 取消应用程序关闭
    return false;
  }

  internal class Module2 : Module
  {
    public Module2()
    {
      ArcGIS.Desktop.Framework.Events.ApplicationClosingEvent.Subscribe(OnApplicationClosing);
    }
    ~Module2()
    {
      ArcGIS.Desktop.Framework.Events.ApplicationClosingEvent.Unsubscribe(OnApplicationClosing);
    }

    private Task OnApplicationClosing(System.ComponentModel.CancelEventArgs args)
    {
      args.Cancel = true;
      return Task.FromResult(0);
    }

    // cref: ARCGIS.DESKTOP.CORE.EVENTS.PROJECTOPENEDEVENT
    // cref: ARCGIS.DESKTOP.CORE.EVENTS.PROJECTOPENEDEVENT.SUBSCRIBE
    // cref: ARCGIS.DESKTOP.CORE.EVENTS.PROJECTOPENEDEVENT.UNSUBSCRIBE
    // cref: ARCGIS.DESKTOP.FRAMEWORK.CONTRACTS.MODULE.INITIALIZE
    // cref: ARCGIS.DESKTOP.FRAMEWORK.CONTRACTS.MODULE.UNINITIALIZE
    #region 如何确定项目何时打开
    protected override bool Initialize() // 在模块初始化时调用。
    {
      ProjectOpenedEvent.Subscribe(OnProjectOpened); // 订阅项目打开事件
      return base.Initialize();
    }

    private void OnProjectOpened(ProjectEventArgs obj) // 项目打开事件处理程序
    {
      MessageBox.Show($"{Project.Current} has opened"); // 显示您的消息框
    }

    protected override void Uninitialize() // 取消订阅项目打开的事件
    {
      ProjectOpenedEvent.Unsubscribe(OnProjectOpened); // 取消订阅
      return;
    }

29 如何在 MapView 中定位可嵌入控件

csharp 复制代码
public ProSnippetMapTool()
{
  // 在构造函数中将MapTool基类的OverlayControlID设置为可嵌入控件的DAML id
  this.OverlayControlID = "ProAppModule1_EmbeddableControl1";
}

protected override void OnToolMouseDown(MapViewMouseButtonEventArgs e)
{
  if (e.ChangedButton == System.Windows.Input.MouseButton.Left)
    e.Handled = true;
}

protected override Task HandleMouseDownAsync(MapViewMouseButtonEventArgs e)
{
  return QueuedTask.Run(() =>
  {
    // 将屏幕坐标点分配给MapTool基类的OverlayControlLocation属性。
    this.OverlayControlPositionRatio = e.ClientPoint;

  });
}

30 激活选项卡时命令搜索中建议的命令选项。

csharp 复制代码
//在 module class..
public override string[] GetSuggestedCMDIDs(string activeTabID)
{
  //返回您希望成为(建议)的daml id的静态列表
  //默认值与给定选项卡相关。它可以是none、some或all of
  //与activeTabID相关的命令。
  //在这个例子中,有两个选项卡。这个例子是任意的
  //标识每个选项卡上只有一个命令作为默认显示在
  //命令搜索列表(when _that_ particular tab is active)
  switch (activeTabID)
  {
    case "CommandSearch_Example_Tab1":
      return new string[] { "CommandSearch_Example_Button2" };
    case "CommandSearch_Example_Tab2":
      return new string[] { "CommandSearch_Example_Button4" };
  }
  return new string[] { "" };
}

31 从命令行启动 ArcGIS Pro

csharp 复制代码
C:\>"C:\Program Files\ArcGIS Pro\bin\ArcGISPro.exe"

32 获取命令行参数

如果您的外接程序需要使用自定义命令行参数,则参数的格式必须为"/argument" - 请注意正斜杠"/"。不能有空格。如果命令行包含要打开的项目(请参阅从命令行打开项目),则必须将自定义参数或开关放在项目文件名参数之前。

csharp 复制代码
string[] args = System.Environment.GetCommandLineArgs();
foreach (var arg in args)
{
    // 寻找你的命令行开关
}

33 应用程序加速器(快捷键)

可以使用加速器/插入加速器 DAML 元素将应用程序加速器添加到外接程序 config.daml 中,该元素具有要与加速器关联的元素的 refID(即快捷方式)。

xml 复制代码
<accelerators>
    <insertAccelerator refID="esri_core_openProjectButton" flags="Ctrl" key="O" />
    <insertAccelerator refID="esri_core_redoButton" flags="Ctrl" key="Y" />
    <insertAccelerator refID="esri_core_undoButton" flags="Ctrl" key="Z" />
</accelerators>

注意:使用 updateModule 元素中的 deleteAccelerator 和 updateAccelerator DAML 元素分别删除或更改应用程序加速器。 标志可以是以下之一:Shift、Ctrl、Alt、Ctrl+Shift、Alt+Shift、Ctrl+Alt、Ctrl+Alt+Shift

34 使用专业样式在 DAML 中定义控件

定义了许多 ArcGIS Pro 样式,这些样式可应用于窗格和停靠窗格上的按钮、标注和其他控件,以使加载项的外观与 ArcGIS Pro 无缝衔接。下面列出了一些最常见的样式。有关更多样式和颜色,请参阅社区示例存储库中的使用 ArcGIS Pro 设置样式示例。

按钮样式

xml 复制代码
<Button Content="Button" Style="{StaticResource Esri_SimpleButton}" ToolTip="Button">
<Button Content="Button" Style="{StaticResource Esri_BackButton}" ToolTip="Button">
<Button Content="Button" Style="{StaticResource Esri_BackButtonSmall}" ToolTip="Button">
<Button Content="Button" Style="{StaticResource Esri_CloseButton}" ToolTip="Button">

码头窗格标题样式

xml 复制代码
<TextBlock Text="MyDockPane" Style="{StaticResource DockPaneHeading}" VerticalAlignment="Center" HorizontalAlignment="Center"/>
相关推荐
吾与谁归in3 分钟前
【C#设计模式(13)——代理模式(Proxy Pattern)】
设计模式·c#·代理模式
吾与谁归in4 分钟前
【C#设计模式(14)——责任链模式( Chain-of-responsibility Pattern)】
设计模式·c#·责任链模式
神仙别闹1 小时前
基于C#和Sql Server 2008实现的(WinForm)订单生成系统
开发语言·c#
向宇it11 小时前
【unity小技巧】unity 什么是反射?反射的作用?反射的使用场景?反射的缺点?常用的反射操作?反射常见示例
开发语言·游戏·unity·c#·游戏引擎
九鼎科技-Leo11 小时前
什么是 WPF 中的依赖属性?有什么作用?
windows·c#·.net·wpf
Heaphaestus,RC12 小时前
【Unity3D】获取 GameObject 的完整层级结构
unity·c#
baivfhpwxf202312 小时前
C# 5000 转16进制 字节(激光器串口通讯生成指定格式命令)
开发语言·c#
直裾12 小时前
Scala全文单词统计
开发语言·c#·scala
GIS思维12 小时前
ArcGIS定义投影与投影的区别(数据和底图不套合的原因和解决办法)
arcgis·gis·地理信息·arcgis坐标系·动态投影
ZwaterZ14 小时前
vue el-table表格点击某行触发事件&&操作栏点击和row-click冲突问题
前端·vue.js·elementui·c#·vue