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
元素中使用 deleteAccelerator
和 updateAccelerator
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 二次开发 - 框架
环境: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如何重构出入库全流程
引言 在制造业与零售业高速发展的今天,仓库管理仍普遍面临效率低、错发漏发频发、库存数据滞后等痛点。人工登记导致30%的错单率,货位混乱让拣货耗时增加50%,而账实不符引发的二次采购成本更吞噬着企业利润。如何突破传统管理桎梏࿱…...
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 镜像源(淘宝镜像 https://registry.npm.taobao.org&…...
【大数据】MapReduce 编程-- PageRank--网页排名算法,用于衡量网页“重要性”-排序网页
PageRank 是 Google 创始人拉里佩奇(Larry Page)和谢尔盖布林(Sergey Brin)在 1998 年提出的一种网页排名算法,用于衡量网页“重要性”的一种方式。它是搜索引擎中用于排序网页的一种基础算法 一个网页越是被其他重要…...
Craw4AI:LLM友好的网页爬虫
GitHub:https://github.com/unclecode/crawl4ai 更多AI开源软件:发现分享好用的AI工具、AI开源软件、AI模型、AI变现 - 小众AI Crawl4AI旨在让网页爬取和数据提取变得简单而高效。无论构建复杂的 AI 应用程序还是增强大语言模型,Crawl4AI 都能…...
idea 安装飞算-javaAI 插件使用
文章目录 前言idea 安装飞算-javaAI 插件使用1. 介绍一下飞算-AI2. 安装使用 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。 而且听说点赞的人每天的运气都不会太差,实在白嫖的…...
Lombok
Lombok Lombok 是一个 Java 库,通过注解自动生成样板代码(如 Getter/Setter、构造函数等),从而简化开发。在你提供的代码中,AllArgsConstructor 就是一个 Lombok 注解。以下是 Lombok 常用注解及其作用的详细说明&…...
起点与破圈
写了多年代码,我为什么开始转向算法,直到如今投身于大模型领域? 作为一名拥有 10 年经验的开发者,我的职业路径几乎覆盖了技术发展的多个阶段。从最早使用 Flask/Django 开发网站,到后来构建大数据系统、设计服务器架…...
基于AI的Web数据管道,使用n8n、Scrapeless和Claude
引言 在当今数据驱动的环境中,组织需要高效的方法来提取、处理和分析网络内容。传统的网络抓取面临着诸多挑战:反机器人保护、复杂的JavaScript渲染以及持续的维护需求。此外,理解非结构化的网络数据则需要复杂的处理能力。 本指南演示了如…...
7GB显存如何部署bf16精度的DeepSeek-R1 70B大模型?
构建RAG混合开发---PythonAIJavaEEVue.js前端的实践-CSDN博客 服务容错治理框架resilience4j&sentinel基础应用---微服务的限流/熔断/降级解决方案-CSDN博客 conda管理python环境-CSDN博客 快速搭建对象存储服务 - Minio,并解决临时地址暴露ip、短链接请求改…...
初识函数------了解函数的定义、函数的参数、函数的返回值、说明文档的书写、函数的嵌套使用、变量的作用域(全局变量与局部变量)
文章目录 一、什么是函数?二、函数定义与调用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文档(下)
格式化的时间形式的常用模式对应关系如下: 空参构造创造simdateformate对象,默认格式 练习.按照指定格式展示 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可以通,ping www.baidu.com不通【DNS出现问题】解决方案 检查IPV6是否有问题 # 1. 检查 IPv6 地址,记住网络接口的名称 ip -6 addr show# 2. 测试本地 IPv6,eth0换成自己的网络接口名称 ping6 ff02::1%eth0# 3. 检查路由 ip…...
Oracle 中 open_cursors 参数详解:原理、配置与性能测试
#Oracle #参数 # open_cursors #ORA-01000 在 Oracle 数据库的众多参数中,open_cursors是一个对应用程序性能和资源管理有着重要影响的参数。它直接关系到数据库与应用程序之间游标资源的使用与分配,合理配置open_cursors参数,能够避免应用程…...
线程调度与单例模式:wait、notify与懒汉模式解析
一.wait 和 notify(等待 和 通知) 引入 wait notify 就是为了能够从应用层面,干预到多个不同线程代码的执行顺序,可以让后执行的线程主动放弃被调度的机会,等先执行的线程完成后通知放弃调度的线程重新执行。 自助取…...
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训练参数(epoch、eval_steps),以实现更细致的观察,避免严重过拟合的情况。 TODO: 利用Qwen3-0.6…...
Oracle 的 PGA_AGGREGATE_LIMIT 参数
Oracle 的 PGA_AGGREGATE_LIMIT 参数 基本概念 PGA_AGGREGATE_LIMIT 是 Oracle 数据库 12c 引入的一个重要内存管理参数,用于限制所有服务器进程使用的 PGA(Program Global Area)内存总量。 参数作用 硬性限制:设置 PGA 内存使…...
# idea 中如何将 java 项目打包成 jar 包?
idea 中如何将 java 项目打包成 jar 包? 例如如何将项目dzs168-dashboard-generate打包成 dzs168-dashboard-generate.jar 1、打开项目结构 Project Structure 在IDEA的顶部菜单栏中选择【File】,然后选择【Project Structure】(或者使用快…...
JVM(Java 虚拟机)深度解析
JVM(Java 虚拟机)深度解析 作为 Java 生态系统的核心,JVM(Java Virtual Machine)是 Java 语言 "一次编写,到处运行" 的关键。它不仅是 Java 程序的运行环境,更是一个复杂的系统软件&…...
算法题(150):拼数
审题: 本题需要我们将数组中的数据经过排序,使得他们拼接后得到的数是所有拼接方案中最大的 思路: 方法一:排序贪心 贪心策略1:直接排序 如果我们直接按照数组数据的字典序进行排序,会导致部分情况出错 eg&…...
怎么样进行定性分析
本文章将教会你如何对实验结果进行定性分析,其需要一定的论文基础,文末有论文撰写小技巧,不想看基础原理的人可以直接调到文章末尾。 一、什么是定性分析 定性分析是一种在众多领域广泛应用的研究方法,它致力于对事物的性质、特…...
RLᵛ_ Better Test-Time Scaling by Unifying LLM Reasoners With Verifiers
RLᵛ: Better Test-Time Scaling by Unifying LLM Reasoners With Verifiers 在人工智能领域,大语言模型(LLM)的推理能力提升一直是研究热点。今天要解读的论文提出了一种全新的强化学习框架RLᵛ,通过融合推理与验证能力…...
关于百度地图JSAPI自定义标注的图标显示不完整的问题(其实只是因为图片尺寸问题)
下载了几个阿里矢量图标库里的图标作为百度地图的自定义图标,结果百度地图显示的图标一直不完整。下载的PNG图标已经被正常引入到前端代码,anchor也设置为了图标底部中心,结果还是显示不完整。 if (iconUrl) {const icon new mapClass.Icon(…...
海思22AP70集超强算力、4K60编解码与多元特性于一体的智能SoC可替代3559V200、3516AV300、3556A
嘿,朋友们!在这个对视觉效果有着极致追求的时代,海思半导体带着满满的诚意,为大家呈上一款堪称惊艳的专业超高清智能网络录像机SoC——22AP70,它就像一颗闪耀的科技新星,即将在各个领域掀起一场视觉革命&am…...
网络协议之一根网线就能连接两台电脑?
写在前面 ~~~~ 如果有两台电脑,通过一根网线可以实现网络互通吗?三台电脑呢?N台电脑呢?本文就以此作为主线来看下吧! 1:正文 ~~~~ 如标题,一根网线就能连接两台电脑?答案是肯定的&a…...
为 Windows 和 Ubuntu 中设定代理服务器的详细方法
有时下载大模型总是下载不出来,要配置代理才行 一、Windows代理设置 ① 系统全局代理设置 打开【设置】→【网络和Internet】→【代理】。 在【手动设置代理】下,打开开关,输入: 地址:10.10.10.215 端口:…...
cmd里可以使用npm,vscode里使用npm 报错
cmd里可以使用npm,vscode里使用npm 报错 报错提示原因解决方法 报错提示 npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系 统上禁止运行脚本。有关详细信息,请参阅 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 之后,会有 mysql 和 mysqld。 MySQL …...
设置windows10同时多用户登录方法
RDP wrapper 的版本更新停止在2017年, 找到网上其它大神更新的软件, 参考:RDPWrap v1.8.9.9 (Windows家庭版开启远程桌面、Server解除远程数量限制) - 吾爱破解 - 52pojie.cn 我的需求是在离线环境中布置,方法是&…...
【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:基于图的基本原理实现走迷宫问题
问题描述 迷宫通常以二维矩阵形式呈现,矩阵中的元素用 0 和 1 表示,其中 0 代表通路,1 代表墙壁 。存在特定的起点和终点坐标,目标是从起点出发,寻找一条能够到达终点的路径。 实现思路 将迷宫中的每个可通行单元格…...
Linux基础第四天
系统之间文件共享 想要实现两个不同的系统之间实现文件共享,最简单的一种方案就是设置VMware软件的共享文件夹,利用共享文件夹可以实现linux系统和windows系统之间的文件共享,这样就可以实现在windows系统上编辑程序,然后在linux系…...
eNSP中单臂路由器配置完整实验及命令解释
单臂路由器(Router on a Stick)是一种通过单个物理接口处理多个VLAN间路由的解决方案 单臂路由器通过以下方式工作: 交换机端口配置为Trunk模式,允许多个VLAN流量通过路由器子接口为每个VLAN创建虚拟接口每个子接口配置对应VLAN…...
TeaType 奶茶性格占卜机开发记录:一场俏皮的 UniApp 单页奇遇
我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 最近我突发奇想,想用 UniApp 做一个轻松又俏皮的小工具,叫做「TeaType 奶茶性格占卜机」…...
AI神经网络降噪 vs 传统单/双麦克风降噪的核心优势对比
1. 降噪原理的本质差异 对比维度传统单/双麦克风降噪AI神经网络降噪技术基础基于固定规则的信号处理(如谱减法、维纳滤波)基于深度学习的动态建模(DNN/CNN/Transformer)噪声样本依赖预设有限噪声类型训练数据覆盖数十万种真实环境…...
【Nginx学习笔记】:Fastapi服务部署单机Nginx配置说明
服务部署单机Nginx配置说明 服务.conf配置文件: 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 的特点 定义:web 是分布在全世界,基于 HTTP 通信协议,存储在 Web 服务器中的所有相互链接的超文本集 Web 是一种分布式超媒体系统Web 是多媒体化 和 易于导航的Web 与平台无关Web 是动态、交互的 2. TCP/IP 结…...
iOS:重新定义移动交互,引领智能生活新潮流
在当今智能手机与移动设备充斥的时代,操作系统作为其 “灵魂”,掌控着用户体验的方方面面。iOS 系统,这一由苹果公司精心雕琢的杰作,自诞生起便以独特魅力与卓越性能,在移动操作系统领域独树一帜,深刻影响着…...
LabVIEW数据库使用说明
介绍LabVIEW如何在数据库中插入记录以及执行 SQL 查询,适用于对数据库进行数据管理和操作的场景。借助 Database Connectivity Toolkit,可便捷地与指定数据库交互。 各 VI 功能详述 左侧 VI 功能概述:实现向数据库表中插入数据的操作。当输入…...
Linux多进程 写时拷贝 物理地址和逻辑地址
如果不采用写时拷贝技术 直接fork子进程 会发生什么? 如上图所示 橙色为父进程所占内存空间 绿色为子进程所占内存空间。 如果子进程只是需要做出一点点和父进程不一样的 其余和父进程均为相同 第一 就会出现复制开销比较大;第二占用内存空间 所以 …...
在 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 提供的一种强大机制,允许程序在运行时(Runtime)动态地获取类的信息、操作类的属性和方法。这种能力使得 Java 程序可以突破编译时的限制,实现更灵活的设计。 一、反射的核心概念 1. 什么是反射 反射是指在程序运行…...
【SpringBoot】从零开始全面解析SpringMVC (三)
本篇博客给大家带来的是SpringBoot的知识点, 本篇是SpringBoot入门, 介绍SpringMVC相关知识. 🐎文章专栏: JavaEE进阶 🚀若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,…...
DeerFlow安装配置及使用案例
DeerFlow安装配置及使用案例 简介 DeerFlow项目由字节跳动技术团队发起和主导开发,作为一个开源深度研究框架,于2025年年初正式开源。该项目基于LangStack生态,构建于LangChain与LangGraph的开源技术栈之上,充分利用语言模型…...
吉林省建筑工程专业技术人员职称评审实施办法
吉林省人力资源和社会保障厅 吉林省建筑工程专业技术人员职称评审实施办法 吉林省建筑工程技术人才之技术员评审条件 吉林省建筑工程技术人才之助理工程师评审条件 吉林省建筑工程技术人才之工程师评审条件 吉林省建筑工程技术人才之高级工程师评审条件 吉林省建筑工程技术人才…...
React组件开发流程-03.1
此章先以一个完整的例子来全面了解下React组件开发的流程,主要是以代码为主,在不同的章节中会把重点标出来,要完成的例子如下,也可从官网中找到。 React组件开发流程 这只是一个通用流程,在熟悉后不需要完全遵从。 …...
Vue 中 v-model 的三种使用方式对比与实践
在 Vue 3 中,v-model 是组件双向数据绑定的核心特性。随着 Vue 的版本演进,v-model 的使用方式也在不断优化。本文将基于您提供的代码示例,详细分析三种不同的 v-model 实现方式:基础用法、useVModel Hook(vueuse/core…...
Adminer:一个基于Web的轻量级数据库管理工具
Adminer 是一个由单个 PHP 文件实现的免费数据库管理工具,支持 MySQL、MariaDB、PostgreSQL、CockroachDB、SQLite、SQL Server、Oracle、Elasticsearch、SimpleDB、MongoDB、Firebird、Clickhouse 等数据库。 Adminer 支持的主要功能如下: 连接数据库服…...
Linux笔记---内核态与用户态
用户态(User Mode) 权限级别:较低,限制应用程序直接访问硬件或关键系统资源。 适用场景:普通应用程序的运行环境。 限制:无法执行特权指令(如操作I/O端口、修改内存管理单元配置等)…...