当前位置: 首页 > news >正文

ArcGIS Pro 3.4 二次开发 - 框架

环境:ArcGIS Pro SDK 3.4 + .NET 8

文章目录

  • 框架
    • 1 框架
      • 1.1 如何在 DockPane 可见或隐藏时订阅和取消订阅事件
      • 1.2 执行命令
      • 1.3 设置当前工具
      • 1.4 激活选项卡
      • 1.5 激活/停用状态 - 修改条件
      • 1.6 判断应用程序是否繁忙
      • 1.7 获取应用程序主窗口
      • 1.8 关闭 ArcGIS Pro
      • 1.9 获取 ArcGIS Pro 版本
      • 1.10 关闭特定窗格
      • 1.11 激活一个窗格
      • 1.12 ProWindow 在屏幕上的位置
      • 1.13 获取当前已安装插件的相关信息
      • 1.14 查找一个停靠面板
      • 1.15 停靠面板属性和方法
      • 1.16 停靠面板的撤销/重做
      • 1.17 查找一个停靠面板并获取其 ViewModel
      • 1.18 打开后台选项卡
      • 1.19 访问当前主题
      • 1.20 显示一个Pro消息框
      • 1.21 添加一个Toast通知
      • 1.22 更改按钮的标题或图像
      • 1.23 获取按钮的工具提示标题
      • 1.24 订阅活动工具更改事件
      • 1.25 进度器 - 简单且不可取消
      • 1.26 进度条 - 可取消
      • 1.27 自定义按钮或工具的 disabledText 属性
      • 1.28 从当前程序集获取图像资源
      • 1.29 阻止ArcGIS Pro关闭
      • 1.30 如何在MapView中定位可嵌入控件
      • 1.31 在激活选项卡时,CommandSearch 中建议的命令选项
      • 1.32 从命令行启动 ArcGIS Pro
      • 1.33 获取命令行参数
      • 1.34 应用程序加速器(快捷键)
      • 1.35 使用 Pro 样式在 DAML 中定义控件

框架

1 框架

1.1 如何在 DockPane 可见或隐藏时订阅和取消订阅事件

private SubscriptionToken _eventToken = null;
// 当 DockPane 的可见性发生变化时调用。
protected override void OnShow(bool isVisible)
{
if (isVisible && _eventToken == null) // 当 dockpane 可见时订阅事件
{
_eventToken = MapSelectionChangedEvent.Subscribe(OnMapSelectionChangedEvent);
}
if (!isVisible && _eventToken != null) // 当 dockpane 关闭时取消订阅
{
MapSelectionChangedEvent.Unsubscribe(_eventToken);
_eventToken = null;
}
}
// 当 MapSelection 事件触发时的事件处理程序。
private void OnMapSelectionChangedEvent(MapSelectionChangedEventArgs obj)
{
MessageBox.Show("选择已更改");
}

1.2 执行命令

IPlugInWrapper wrapper = FrameworkApplication.GetPlugInWrapper("esri_editing_ShowAttributes"); // 获取插件包装器
var command = wrapper as ICommand; // 将插件包装器转换为ICommand接口,工具和命令(按钮)支持此接口
if ((command != null) && command.CanExecute(null)) // 检查命令是否可执行
command.Execute(null); // 执行命令

1.3 设置当前工具

// 使用 SetCurrentToolAsync 方法设置当前工具
FrameworkApplication.SetCurrentToolAsync("esri_mapping_selectByRectangleTool");
// 或者使用 ICommand.Execute 方法设置当前工具
ICommand cmd = FrameworkApplication.GetPlugInWrapper("esri_mapping_selectByRectangleTool") as ICommand;
if ((cmd != null) && cmd.CanExecute(null))
cmd.Execute(null);

1.4 激活选项卡

// 激活名为 "esri_mapping_insertTab" 的选项卡
FrameworkApplication.ActivateTab("esri_mapping_insertTab");

1.5 激活/停用状态 - 修改条件

// 根据状态在DAML文件中定义条件
if (activate)
FrameworkApplication.State.Activate("someState"); // 激活某个状态
else
FrameworkApplication.State.Deactivate("someState"); // 停用某个状态

1.6 判断应用程序是否繁忙

// 如果主工作线程上当前有任务正在运行,或者任何窗格或停靠窗格报告其处于繁忙或初始化状态,则认为应用程序繁忙。
// 许多 Pro 样式(如 Esri_SimpleButton)确保当 FrameworkApplication.IsBusy 为 true 时,按钮被禁用。
// 您可以使用此属性绑定到停靠窗格或窗格上控件(如列表框)的 IsEnabled 属性,以便在应用程序繁忙时禁用用户交互。
bool isbusy = FrameworkApplication.IsBusy;

1.7 获取应用程序主窗口

System.Windows.Window window = FrameworkApplication.Current.MainWindow;
// 将窗口居中
Rect rect = System.Windows.SystemParameters.WorkArea;
FrameworkApplication.Current.MainWindow.Left = rect.Left + (rect.Width - FrameworkApplication.Current.MainWindow.ActualWidth) / 2;
FrameworkApplication.Current.MainWindow.Top = rect.Top + (rect.Height - FrameworkApplication.Current.MainWindow.ActualHeight) / 2;

1.8 关闭 ArcGIS Pro

FrameworkApplication.Close(); // 关闭 ArcGIS Pro 应用程序

1.9 获取 ArcGIS Pro 版本

// "GetEntryAssembly" 应该返回 ArcGISPro.exe
string version = System.Reflection.Assembly.GetEntryAssembly()
.GetName().Version.ToString();

1.10 关闭特定窗格

string _viewPaneID = "my pane"; // 你的窗格的DAML ID
// 你可能会有多个窗格实例(InstanceIDs)。
// 因此你可以遍历所有窗格,只获取“你的”窗格
IList<uint> myPaneInstanceIDs = new List<uint>();
foreach (Pane pane in FrameworkApplication.Panes)
{
if (pane.ContentID == _viewPaneID)
{
myPaneInstanceIDs.Add(pane.InstanceID); // 你的窗格的InstanceID,可能有多个,所以构建集合
}
}
foreach (var instanceID in myPaneInstanceIDs) // 关闭每一个“你的”窗格。
{
FrameworkApplication.Panes.ClosePane(instanceID);
}

1.11 激活一个窗格

// 获取所有地图窗格
var mapPanes = ProApp.Panes.OfType<IMapPane>();
// 遍历每个地图窗格
foreach (Pane pane in mapPanes)
{// 检查窗格的标题是否为"MyMap"if (pane.Caption == "MyMap"){// 激活该窗格pane.Activate();// 退出循环break;}
}

1.12 ProWindow 在屏幕上的位置

ProWindow1 _prowindow1 = null;
{
double left = 150; //窗口的左边缘,相对于桌面
double top = 150; //窗口的顶部边缘,相对于桌面
//窗口是否已经打开?
if (_prowindow1 != null)
return;
_prowindow1 = new ProWindow1(left, top); //创建窗口
_prowindow1.Owner = FrameworkApplication.Current.MainWindow;
_prowindow1.Closed += (o, e) => { _prowindow1 = null; };
//除非将 SaveWindowPosition 设置为 false,否则 MetroWindows 会记住它们最后的位置。
_prowindow1.SaveWindowPosition = false; //设置为 false 以覆盖最后的位置
_prowindow1.Show();
//取消注释以模态方式显示
//_prowindow1.ShowDialog();
}

1.13 获取当前已安装插件的相关信息

var addin_infos = FrameworkApplication.GetAddInInfos(); // 获取所有已安装插件的信息
StringBuilder sb = new StringBuilder(); // 创建一个StringBuilder对象用于拼接字符串
foreach (var info in addin_infos) // 遍历每个插件的信息
{
if (info == null)
break; // 如果没有插件信息,则退出循环
sb.AppendLine($"Addin: {info.Name}"); // 添加插件名称
sb.AppendLine($"Description {info.Description}"); // 添加插件描述
sb.AppendLine($"ImagePath {info.ImagePath}"); // 添加插件图片路径
sb.AppendLine($"Author {info.Author}"); // 添加插件作者
sb.AppendLine($"Company {info.Company}"); // 添加插件公司
sb.AppendLine($"Date {info.Date}"); // 添加插件日期
sb.AppendLine($"Version {info.Version}"); // 添加插件版本
sb.AppendLine($"FullPath {info.FullPath}"); // 添加插件完整路径
sb.AppendLine($"DigitalSignature {info.DigitalSignature}"); // 添加插件数字签名
sb.AppendLine($"IsCompatible {info.IsCompatible}"); // 添加插件兼容性信息
sb.AppendLine($"IsDeleted {info.IsDeleted}"); // 添加插件是否已删除
sb.AppendLine($"TargetVersion {info.TargetVersion}"); // 添加插件目标版本
sb.AppendLine($"ErrorMsg {info.ErrorMsg}"); // 添加插件错误信息
sb.AppendLine($"ID {info.ID}"); // 添加插件ID
sb.AppendLine(""); // 添加空行分隔不同插件的信息
}
System.Diagnostics.Debug.WriteLine(sb.ToString()); // 在调试窗口输出插件信息
MessageBox.Show(sb.ToString(), "Addin Infos"); // 弹出对话框显示插件信息

1.14 查找一个停靠面板

// 为了查找一个停靠面板,你需要知道它的DAML ID
var pane = FrameworkApplication.DockPaneManager.Find("esri_core_ProjectDockPane");

1.15 停靠面板属性和方法

// 为了找到停靠面板,你需要知道它的DAML id
var pane = FrameworkApplication.DockPaneManager.Find("esri_core_ProjectDockPane");
// 确定可见性
bool visible = pane.IsVisible;
// 激活它
pane.Activate();
// 确定停靠面板状态
DockPaneState state = pane.DockState;
// 固定它
pane.Pin();
// 隐藏它
pane.Hide();

1.16 停靠面板的撤销/重做

// 为了找到一个停靠面板,你需要知道它的DAML id
var pane = FrameworkApplication.DockPaneManager.Find("esri_core_contentsDockPane");
// 获取操作管理器
OperationManager manager = pane.OperationManager;
if (manager != null)
{
// 撤销一个操作
if (manager.CanUndo)
await manager.UndoAsync();
// 重做一个操作
if (manager.CanRedo)
await manager.RedoAsync();
// 清除特定类别的撤销和重做操作栈
manager.ClearUndoCategory("Some category");
manager.ClearRedoCategory("Some category");
}

1.17 查找一个停靠面板并获取其 ViewModel

// 为了找到一个停靠面板,你需要知道它的 DAML id。
// 下面是一个定义了停靠面板的 DAML 示例。一旦找到停靠面板,你可以将其转换为
// 由 className 属性定义的停靠面板 ViewModel。
//
//<dockPanes>
//  <dockPane id="MySample_Dockpane" caption="Dockpane 1" className="Dockpane1ViewModel" dock="bottom" height="5">
//    <content className="Dockpane1View" />
//  </dockPane>
//</dockPanes>
Dockpane1ViewModel vm = FrameworkApplication.DockPaneManager.Find("MySample_Dockpane") as Dockpane1ViewModel;

1.18 打开后台选项卡

// 打开后台到“关于 ArcGIS Pro”选项卡。
FrameworkApplication.OpenBackstage("esri_core_aboutTab");

1.19 访问当前主题

//获取应用程序的主题
var theme = FrameworkApplication.ApplicationTheme;
//ApplicationTheme 枚举
if (FrameworkApplication.ApplicationTheme == ApplicationTheme.Dark)
{
//暗色主题
}
if (FrameworkApplication.ApplicationTheme == ApplicationTheme.HighContrast)
{
//高对比度主题
}
if (FrameworkApplication.ApplicationTheme == ApplicationTheme.Default)
{
//亮色/默认主题
}

1.20 显示一个Pro消息框

ArcGIS.Desktop.Framework.Dialogs.MessageBox.Show("Some Message", "Some title", MessageBoxButton.YesNo, MessageBoxImage.Information, MessageBoxResult.Yes);
// 显示一个消息框,包含消息内容、标题、按钮类型(是/否)、图标类型(信息)和默认按钮(是)

1.21 添加一个Toast通知

Notification notification = new Notification(); // 创建一个新的通知对象
notification.Title = FrameworkApplication.Title; // 设置通知的标题为应用程序的标题
notification.Message = "Notification 1"; // 设置通知的消息内容
notification.ImageSource = System.Windows.Application.Current.Resources["ToastLicensing32"] as ImageSource; // 设置通知的图标资源
ArcGIS.Desktop.Framework.FrameworkApplication.AddNotification(notification); // 将通知添加到应用程序中

1.22 更改按钮的标题或图像

private void ChangeCaptionImage()
{
IPlugInWrapper wrapper = FrameworkApplication.GetPlugInWrapper("MyAddin_MyCustomButton");
if (wrapper != null)
{
wrapper.Caption = "new caption"; // 设置按钮的新标题
// 确保在插件的 images 文件夹中包含 T-Rex16 和 T-Rex32 图片,并且设置
// BuildAction = Resource 和 Copy to OutputDirectory = Do not copy
wrapper.SmallImage = BuildImage("T-Rex16.png"); // 设置按钮的小图标
wrapper.LargeImage = BuildImage("T-Rex32.png"); // 设置按钮的大图标
}
}
private ImageSource BuildImage(string imageName)
{
return new BitmapImage(PackUriForResource(imageName)); // 根据图片名称构建 ImageSource
}
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); // 构建资源 URI
}

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

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

1.24 订阅活动工具更改事件

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)
{// 获取前一个工具的IDstring prevTool = args.PreviousID;// 获取当前工具的IDstring newTool = args.CurrentID;
}

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

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);
}

1.26 进度条 - 可取消

public async Task Progressor_Cancelable()
{
// 创建一个可取消的进度条源,标题为 "Doing my thing - cancelable",取消时的消息为 "Canceled"
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);
}

1.27 自定义按钮或工具的 disabledText 属性

//在 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 = "缺少条件 1";
}
}
}

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

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);
// 构建资源路径的URI字符串
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);
// 返回绝对URI
return new Uri(uriString, UriKind.Absolute);
}

1.29 阻止ArcGIS Pro关闭

// 有两种方法可以阻止ArcGIS Pro关闭
// 1. 在您的插件的模块中重写CanUnload方法并返回false。
// 2. 订阅ApplicationClosing事件并在接收到事件时取消它
internal class Module1 : Module
{
// 当ArcGIS Pro关闭时由Framework调用
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;
}

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

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基类的OverlayControlPositionRatio属性
this.OverlayControlPositionRatio = e.ClientPoint;
});
}

1.31 在激活选项卡时,CommandSearch 中建议的命令选项

//在模块类中..
public override string[] GetSuggestedCMDIDs(string activeTabID)
{
//返回你希望作为(建议的)默认值的静态 daml id 列表,这些默认值与给定的选项卡相关。
//它可以是与 activeTabID 关联的命令中的无、部分或全部。
//在此示例中,有两个选项卡。此示例任意地
//为每个选项卡标识一个命令,作为在命令搜索列表中显示的默认值(当_该_特定选项卡处于活动状态时)
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[] { "" };
}

1.32 从命令行启动 ArcGIS Pro

C:\>"C:\Program Files\ArcGIS Pro\bin\ArcGISPro.exe"  # 运行ArcGIS Pro的可执行文件

1.33 获取命令行参数

如果你的插件需要使用自定义的命令行参数,你的参数必须采用 “/argument” 的形式——请注意正斜杠 “/”。参数中不能包含空格。如果命令行中包含要打开的项目(参见从命令行打开项目),则自定义参数或开关必须放在项目文件名参数之前。

string[] args = System.Environment.GetCommandLineArgs(); // 获取命令行参数数组
foreach (var arg in args)
{
// 查找你的命令行开关
}

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

可以在您的 Add-in config.daml 中使用 accelerators/insertAccelerator DAML 元素来添加快捷键,其中 refID 是您要关联加速器(即快捷键)的元素的引用 ID。

<accelerators>
<!-- 为打开项目按钮添加快捷键 Ctrl+O -->
<insertAccelerator refID="esri_core_openProjectButton" flags="Ctrl" key="O" />
<!-- 为重做按钮添加快捷键 Ctrl+Y -->
<insertAccelerator refID="esri_core_redoButton" flags="Ctrl" key="Y" />
<!-- 为撤销按钮添加快捷键 Ctrl+Z -->
<insertAccelerator refID="esri_core_undoButton" flags="Ctrl" key="Z" />
</accelerators>

注意:可以在 updateModule 元素中使用 deleteAcceleratorupdateAccelerator DAML 元素来分别删除或修改应用程序加速器。
flags 可以是以下之一:Shift、Ctrl、Alt、Ctrl+Shift、Alt+Shift、Ctrl+Alt、Ctrl+Alt+Shift。

1.35 使用 Pro 样式在 DAML 中定义控件

有许多 ArcGIS Pro 样式可以应用于窗格和停靠窗格上的按钮、标签和其他控件,以使您的插件与 ArcGIS Pro 无缝融合。下面列出了一些最常见的样式。更多样式和颜色请参阅社区示例库中的 Styling-With-ArcGIS-Pro 示例。

按钮样式

<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"> <!-- 关闭按钮样式 -->

停靠窗格标题样式

<TextBlock Text="MyDockPane" Style="{StaticResource DockPaneHeading}" <!-- 停靠窗格标题样式 -->
VerticalAlignment="Center" HorizontalAlignment="Center"/>

相关文章:

ArcGIS Pro 3.4 二次开发 - 框架

环境&#xff1a;ArcGIS Pro SDK 3.4 .NET 8 文章目录 框架1 框架1.1 如何在 DockPane 可见或隐藏时订阅和取消订阅事件1.2 执行命令1.3 设置当前工具1.4 激活选项卡1.5 激活/停用状态 - 修改条件1.6 判断应用程序是否繁忙1.7 获取应用程序主窗口1.8 关闭 ArcGIS Pro1.9 获取 …...

打破传统仓库管理困局:WMS如何重构出入库全流程

引言 在制造业与零售业高速发展的今天&#xff0c;仓库管理仍普遍面临效率低、错发漏发频发、库存数据滞后等痛点。人工登记导致30%的错单率&#xff0c;货位混乱让拣货耗时增加50%&#xff0c;而账实不符引发的二次采购成本更吞噬着企业利润。如何突破传统管理桎梏&#xff1…...

npm 安装时 SSL 证书过期问题笔记

问题描述: npm error code CERT_HAS_EXPIRED npm error errno CERT_HAS_EXPIRED npm error request to https://registry.npm.taobao.org/axios failed, reason: certificate has expired 这表明当前配置的 npm 镜像源&#xff08;淘宝镜像 https://registry.npm.taobao.org&…...

【大数据】MapReduce 编程-- PageRank--网页排名算法,用于衡量网页“重要性”-排序网页

PageRank 是 Google 创始人拉里佩奇&#xff08;Larry Page&#xff09;和谢尔盖布林&#xff08;Sergey Brin&#xff09;在 1998 年提出的一种网页排名算法&#xff0c;用于衡量网页“重要性”的一种方式。它是搜索引擎中用于排序网页的一种基础算法 一个网页越是被其他重要…...

Craw4AI:LLM友好的网页爬虫

GitHub&#xff1a;https://github.com/unclecode/crawl4ai 更多AI开源软件&#xff1a;发现分享好用的AI工具、AI开源软件、AI模型、AI变现 - 小众AI Crawl4AI旨在让网页爬取和数据提取变得简单而高效。无论构建复杂的 AI 应用程序还是增强大语言模型&#xff0c;Crawl4AI 都能…...

idea 安装飞算-javaAI 插件使用

文章目录 前言idea 安装飞算-javaAI 插件使用1. 介绍一下飞算-AI2. 安装使用 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的…...

Lombok

Lombok Lombok 是一个 Java 库&#xff0c;通过注解自动生成样板代码&#xff08;如 Getter/Setter、构造函数等&#xff09;&#xff0c;从而简化开发。在你提供的代码中&#xff0c;AllArgsConstructor 就是一个 Lombok 注解。以下是 Lombok 常用注解及其作用的详细说明&…...

起点与破圈

写了多年代码&#xff0c;我为什么开始转向算法&#xff0c;直到如今投身于大模型领域&#xff1f; 作为一名拥有 10 年经验的开发者&#xff0c;我的职业路径几乎覆盖了技术发展的多个阶段。从最早使用 Flask/Django 开发网站&#xff0c;到后来构建大数据系统、设计服务器架…...

基于AI的Web数据管道,使用n8n、Scrapeless和Claude

引言 在当今数据驱动的环境中&#xff0c;组织需要高效的方法来提取、处理和分析网络内容。传统的网络抓取面临着诸多挑战&#xff1a;反机器人保护、复杂的JavaScript渲染以及持续的维护需求。此外&#xff0c;理解非结构化的网络数据则需要复杂的处理能力。 本指南演示了如…...

7GB显存如何部署bf16精度的DeepSeek-R1 70B大模型?

构建RAG混合开发---PythonAIJavaEEVue.js前端的实践-CSDN博客 服务容错治理框架resilience4j&sentinel基础应用---微服务的限流/熔断/降级解决方案-CSDN博客 conda管理python环境-CSDN博客 快速搭建对象存储服务 - Minio&#xff0c;并解决临时地址暴露ip、短链接请求改…...

初识函数------了解函数的定义、函数的参数、函数的返回值、说明文档的书写、函数的嵌套使用、变量的作用域(全局变量与局部变量)

文章目录 一、什么是函数&#xff1f;二、函数定义与调用2.1 基本语法2.2 示例演示 三、函数参数详解3.1 位置参数3.2 默认参数3.3 可变参数3.4 关键字参数 四、返回值与文档说明4.1 返回多个值4.2 编写文档字符串 五、函数嵌套与作用域5.1 嵌套函数示例5.2 变量作用域5.3 glob…...

Java常见API文档(下)

格式化的时间形式的常用模式对应关系如下&#xff1a; 空参构造创造simdateformate对象&#xff0c;默认格式 练习.按照指定格式展示 package kl002;import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date;public class Date3 {publi…...

ubuntu 20.04 ping baidu.coom可以通,ping www.baidu.com不通 【DNS出现问题】解决方案

ping baidu.coom可以通&#xff0c;ping www.baidu.com不通【DNS出现问题】解决方案 检查IPV6是否有问题 # 1. 检查 IPv6 地址&#xff0c;记住网络接口的名称 ip -6 addr show# 2. 测试本地 IPv6&#xff0c;eth0换成自己的网络接口名称 ping6 ff02::1%eth0# 3. 检查路由 ip…...

Oracle 中 open_cursors 参数详解:原理、配置与性能测试

#Oracle #参数 # open_cursors #ORA-01000 在 Oracle 数据库的众多参数中&#xff0c;open_cursors是一个对应用程序性能和资源管理有着重要影响的参数。它直接关系到数据库与应用程序之间游标资源的使用与分配&#xff0c;合理配置open_cursors参数&#xff0c;能够避免应用程…...

线程调度与单例模式:wait、notify与懒汉模式解析

一.wait 和 notify&#xff08;等待 和 通知&#xff09; 引入 wait notify 就是为了能够从应用层面&#xff0c;干预到多个不同线程代码的执行顺序&#xff0c;可以让后执行的线程主动放弃被调度的机会&#xff0c;等先执行的线程完成后通知放弃调度的线程重新执行。 自助取…...

AGI大模型(27):LangChain向量存储

1 安装依赖 使用一个简单的本地向量存储 FAISS,首先需要安装它 pip install faiss-cpu -i https://pypi.tuna.tsinghua.edu.cn/simple pip install langchain_community==0.3.7 -i https://pypi.tuna.tsinghua.edu.cn/simple 由于演示过程中用到了爬虫,需要安装依赖库,如…...

Qwen3 - 0.6B与Bert文本分类实验:深度见解与性能剖析

Changelog [25/04/28] 新增Qwen3-0.6B在Ag_news数据集Zero-Shot的效果。新增Qwen3-0.6B线性层分类方法的效果。调整Bert训练参数&#xff08;epoch、eval_steps&#xff09;&#xff0c;以实现更细致的观察&#xff0c;避免严重过拟合的情况。 TODO&#xff1a; 利用Qwen3-0.6…...

Oracle 的 PGA_AGGREGATE_LIMIT 参数

Oracle 的 PGA_AGGREGATE_LIMIT 参数 基本概念 PGA_AGGREGATE_LIMIT 是 Oracle 数据库 12c 引入的一个重要内存管理参数&#xff0c;用于限制所有服务器进程使用的 PGA&#xff08;Program Global Area&#xff09;内存总量。 参数作用 硬性限制&#xff1a;设置 PGA 内存使…...

# idea 中如何将 java 项目打包成 jar 包?

idea 中如何将 java 项目打包成 jar 包&#xff1f; 例如如何将项目dzs168-dashboard-generate打包成 dzs168-dashboard-generate.jar 1、打开项目结构 Project Structure 在IDEA的顶部菜单栏中选择【File】&#xff0c;然后选择【Project Structure】&#xff08;或者使用快…...

JVM(Java 虚拟机)深度解析

JVM&#xff08;Java 虚拟机&#xff09;深度解析 作为 Java 生态系统的核心&#xff0c;JVM&#xff08;Java Virtual Machine&#xff09;是 Java 语言 "一次编写&#xff0c;到处运行" 的关键。它不仅是 Java 程序的运行环境&#xff0c;更是一个复杂的系统软件&…...

算法题(150):拼数

审题&#xff1a; 本题需要我们将数组中的数据经过排序&#xff0c;使得他们拼接后得到的数是所有拼接方案中最大的 思路&#xff1a; 方法一&#xff1a;排序贪心 贪心策略1&#xff1a;直接排序 如果我们直接按照数组数据的字典序进行排序&#xff0c;会导致部分情况出错 eg&…...

怎么样进行定性分析

本文章将教会你如何对实验结果进行定性分析&#xff0c;其需要一定的论文基础&#xff0c;文末有论文撰写小技巧&#xff0c;不想看基础原理的人可以直接调到文章末尾。 一、什么是定性分析 定性分析是一种在众多领域广泛应用的研究方法&#xff0c;它致力于对事物的性质、特…...

RLᵛ_ Better Test-Time Scaling by Unifying LLM Reasoners With Verifiers

RLᵛ: Better Test-Time Scaling by Unifying LLM Reasoners With Verifiers 在人工智能领域&#xff0c;大语言模型&#xff08;LLM&#xff09;的推理能力提升一直是研究热点。今天要解读的论文提出了一种全新的强化学习框架RLᵛ&#xff0c;通过融合推理与验证能力&#xf…...

关于百度地图JSAPI自定义标注的图标显示不完整的问题(其实只是因为图片尺寸问题)

下载了几个阿里矢量图标库里的图标作为百度地图的自定义图标&#xff0c;结果百度地图显示的图标一直不完整。下载的PNG图标已经被正常引入到前端代码&#xff0c;anchor也设置为了图标底部中心&#xff0c;结果还是显示不完整。 if (iconUrl) {const icon new mapClass.Icon(…...

海思22AP70集超强算力、4K60编解码与多元特性于一体的智能SoC可替代3559V200、3516AV300、3556A

嘿&#xff0c;朋友们&#xff01;在这个对视觉效果有着极致追求的时代&#xff0c;海思半导体带着满满的诚意&#xff0c;为大家呈上一款堪称惊艳的专业超高清智能网络录像机SoC——22AP70&#xff0c;它就像一颗闪耀的科技新星&#xff0c;即将在各个领域掀起一场视觉革命&am…...

网络协议之一根网线就能连接两台电脑?

写在前面 ~~~~ 如果有两台电脑&#xff0c;通过一根网线可以实现网络互通吗&#xff1f;三台电脑呢&#xff1f;N台电脑呢&#xff1f;本文就以此作为主线来看下吧&#xff01; 1&#xff1a;正文 ~~~~ 如标题&#xff0c;一根网线就能连接两台电脑&#xff1f;答案是肯定的&a…...

为 Windows 和 Ubuntu 中设定代理服务器的详细方法

有时下载大模型总是下载不出来&#xff0c;要配置代理才行 一、Windows代理设置 ① 系统全局代理设置 打开【设置】→【网络和Internet】→【代理】。 在【手动设置代理】下&#xff0c;打开开关&#xff0c;输入&#xff1a; 地址&#xff1a;10.10.10.215 端口&#xff1a;…...

cmd里可以使用npm,vscode里使用npm 报错

cmd里可以使用npm,vscode里使用npm 报错 报错提示原因解决方法 报错提示 npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1&#xff0c;因为在此系 统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/go.microsoft.com/ fwlink/?LinkID135170 中的 about_Executi…...

MySQL数据库基础 -- SQL 语句的分类,存储引擎

目录 1. 什么是数据库 2. 基本使用 2.1 进入 mysql 2.2 服务器、数据库以及表的关系 2.3 使用案例 2.4 数据逻辑存储 3. SQL 语句分类 4. 存储引擎 4.1 查看存储引擎 4.2 存储引擎的对比 1. 什么是数据库 安装完 MySQL 之后&#xff0c;会有 mysql 和 mysqld。 MySQL …...

设置windows10同时多用户登录方法

RDP wrapper 的版本更新停止在2017年&#xff0c; 找到网上其它大神更新的软件&#xff0c; 参考&#xff1a;RDPWrap v1.8.9.9 (Windows家庭版开启远程桌面、Server解除远程数量限制&#xff09; - 吾爱破解 - 52pojie.cn 我的需求是在离线环境中布置&#xff0c;方法是&…...

【hive】hive内存dump导出hprof文件

使用jmap -dump:live,formatb,file命令 hive-metastore-heap-eval.sh文件 # if want hiveserver2 ,should grep "org.apache.hive.service.server.HiveServer2" # get pid pidps -ef | grep "org.apache.hadoop.hive.metastore.HiveMetaStore" | grep &qu…...

专题讨论3:基于图的基本原理实现走迷宫问题

问题描述 迷宫通常以二维矩阵形式呈现&#xff0c;矩阵中的元素用 0 和 1 表示&#xff0c;其中 0 代表通路&#xff0c;1 代表墙壁 。存在特定的起点和终点坐标&#xff0c;目标是从起点出发&#xff0c;寻找一条能够到达终点的路径。 实现思路 将迷宫中的每个可通行单元格…...

Linux基础第四天

系统之间文件共享 想要实现两个不同的系统之间实现文件共享&#xff0c;最简单的一种方案就是设置VMware软件的共享文件夹&#xff0c;利用共享文件夹可以实现linux系统和windows系统之间的文件共享&#xff0c;这样就可以实现在windows系统上编辑程序&#xff0c;然后在linux系…...

eNSP中单臂路由器配置完整实验及命令解释

单臂路由器&#xff08;Router on a Stick&#xff09;是一种通过单个物理接口处理多个VLAN间路由的解决方案 单臂路由器通过以下方式工作&#xff1a; 交换机端口配置为Trunk模式&#xff0c;允许多个VLAN流量通过路由器子接口为每个VLAN创建虚拟接口每个子接口配置对应VLAN…...

TeaType 奶茶性格占卜机开发记录:一场俏皮的 UniApp 单页奇遇

我正在参加CodeBuddy「首席试玩官」内容创作大赛&#xff0c;本文所使用的 CodeBuddy 免费下载链接&#xff1a;腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 最近我突发奇想&#xff0c;想用 UniApp 做一个轻松又俏皮的小工具&#xff0c;叫做「TeaType 奶茶性格占卜机」…...

AI神经网络降噪 vs 传统单/双麦克风降噪的核心优势对比

1. 降噪原理的本质差异 对比维度传统单/双麦克风降噪AI神经网络降噪技术基础基于固定规则的信号处理&#xff08;如谱减法、维纳滤波&#xff09;基于深度学习的动态建模&#xff08;DNN/CNN/Transformer&#xff09;噪声样本依赖预设有限噪声类型训练数据覆盖数十万种真实环境…...

【Nginx学习笔记】:Fastapi服务部署单机Nginx配置说明

服务部署单机Nginx配置说明 服务.conf配置文件&#xff1a; upstream asr_backend {server 127.0.0.1:8010; }server {listen 80;server_name your_domain.com;location / {proxy_pass http://localhost:8000;proxy_set_header Host $host;proxy_set_header X-Real-IP $remot…...

JAVA Web 期末速成

一、专业术语及名词 1. Web 的特点 定义&#xff1a;web 是分布在全世界&#xff0c;基于 HTTP 通信协议&#xff0c;存储在 Web 服务器中的所有相互链接的超文本集 Web 是一种分布式超媒体系统Web 是多媒体化 和 易于导航的Web 与平台无关Web 是动态、交互的 2. TCP/IP 结…...

iOS:重新定义移动交互,引领智能生活新潮流

在当今智能手机与移动设备充斥的时代&#xff0c;操作系统作为其 “灵魂”&#xff0c;掌控着用户体验的方方面面。iOS 系统&#xff0c;这一由苹果公司精心雕琢的杰作&#xff0c;自诞生起便以独特魅力与卓越性能&#xff0c;在移动操作系统领域独树一帜&#xff0c;深刻影响着…...

LabVIEW数据库使用说明

介绍LabVIEW如何在数据库中插入记录以及执行 SQL 查询&#xff0c;适用于对数据库进行数据管理和操作的场景。借助 Database Connectivity Toolkit&#xff0c;可便捷地与指定数据库交互。 各 VI 功能详述 左侧 VI 功能概述&#xff1a;实现向数据库表中插入数据的操作。当输入…...

Linux多进程 写时拷贝 物理地址和逻辑地址

如果不采用写时拷贝技术 直接fork子进程 会发生什么&#xff1f; 如上图所示 橙色为父进程所占内存空间 绿色为子进程所占内存空间。 如果子进程只是需要做出一点点和父进程不一样的 其余和父进程均为相同 第一 就会出现复制开销比较大&#xff1b;第二占用内存空间 所以 …...

在 CentOS 7.9 上部署 node_exporter 并接入 Prometheus + Grafana 实现主机监控

文章目录 在 CentOS 7.9 上部署 node_exporter 并接入 Prometheus Grafana 实现主机监控环境说明node_exporter 安装与配置下载并解压 node_exporter创建 Systemd 启动服务验证服务状态验证端口监听 Prometheus 配置 node_exporter 监控项修改 prometheus.yml重新加载 Prometh…...

Java 反射(Reflection)技术

反射是 Java 提供的一种强大机制&#xff0c;允许程序在运行时&#xff08;Runtime&#xff09;动态地获取类的信息、操作类的属性和方法。这种能力使得 Java 程序可以突破编译时的限制&#xff0c;实现更灵活的设计。 一、反射的核心概念 1. 什么是反射 反射是指在程序运行…...

【SpringBoot】从零开始全面解析SpringMVC (三)

本篇博客给大家带来的是SpringBoot的知识点, 本篇是SpringBoot入门, 介绍SpringMVC相关知识. &#x1f40e;文章专栏: JavaEE进阶 &#x1f680;若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,…...

DeerFlow安装配置及使用案例

DeerFlow安装配置及使用案例 简介 ​ DeerFlow项目由字节跳动技术团队发起和主导开发&#xff0c;作为一个开源深度研究框架&#xff0c;于2025年年初正式开源。该项目基于LangStack生态&#xff0c;构建于LangChain与LangGraph的开源技术栈之上&#xff0c;充分利用语言模型…...

吉林省建筑工程专业技术人员职称评审实施办法

吉林省人力资源和社会保障厅 吉林省建筑工程专业技术人员职称评审实施办法 吉林省建筑工程技术人才之技术员评审条件 吉林省建筑工程技术人才之助理工程师评审条件 吉林省建筑工程技术人才之工程师评审条件 吉林省建筑工程技术人才之高级工程师评审条件 吉林省建筑工程技术人才…...

React组件开发流程-03.1

此章先以一个完整的例子来全面了解下React组件开发的流程&#xff0c;主要是以代码为主&#xff0c;在不同的章节中会把重点标出来&#xff0c;要完成的例子如下&#xff0c;也可从官网中找到。 React组件开发流程 这只是一个通用流程&#xff0c;在熟悉后不需要完全遵从。 …...

Vue 中 v-model 的三种使用方式对比与实践

在 Vue 3 中&#xff0c;v-model 是组件双向数据绑定的核心特性。随着 Vue 的版本演进&#xff0c;v-model 的使用方式也在不断优化。本文将基于您提供的代码示例&#xff0c;详细分析三种不同的 v-model 实现方式&#xff1a;基础用法、useVModel Hook&#xff08;vueuse/core…...

Adminer:一个基于Web的轻量级数据库管理工具

Adminer 是一个由单个 PHP 文件实现的免费数据库管理工具&#xff0c;支持 MySQL、MariaDB、PostgreSQL、CockroachDB、SQLite、SQL Server、Oracle、Elasticsearch、SimpleDB、MongoDB、Firebird、Clickhouse 等数据库。 Adminer 支持的主要功能如下&#xff1a; 连接数据库服…...

Linux笔记---内核态与用户态

用户态&#xff08;User Mode&#xff09; 权限级别&#xff1a;较低&#xff0c;限制应用程序直接访问硬件或关键系统资源。 适用场景&#xff1a;普通应用程序的运行环境。 限制&#xff1a;无法执行特权指令&#xff08;如操作I/O端口、修改内存管理单元配置等&#xff09…...