关于Pro addin中,控制dockpane的状态

Posted on   云起  阅读(12)  评论(0编辑  收藏  举报  
在Pro SDK中,可以通过dackpane的Hide()方法,对面板进行隐藏。
DockPane pane = FrameworkApplication.DockPaneManager.Find("pane_name");
pane.Hide();

但有个同事,在自定义的module中,希望在初始化方法中对指定的面板进行关闭,但使用Hide方法后,面板依旧显示。

究其原因,是Pro中进行布局还原导致的。

工程文件中,会将控件的布局信息进行存储,在下一次打开工程的时候,根据布局状态,将控件还原为上一次的状态。

当使用Module以autoload的方式加载时,会随core模块一起进行初始化,而非按需初始化,所以自定义模块的初始化方法执行的时间点会比较靠前。而对控件的状态控制,也会被Pro内部的布局还原而覆盖。

为了应对需求,提供两种方式来进行处理:

1、在工程关闭时进行后处理

protected override bool Initialize()
{
    ArcGIS.Desktop.Core.Events.ProjectClosingEvent.Subscribe((p) =>
    {
        //相关的控件控制
        return Task.FromResult(0);
    });
}

这样,工程保存布局信息,就是复合需求的,再次打开时就无需前处理了。

2、在初始化时,添加异步前处理

protected override bool Initialize()
{
    ArcGIS.Desktop.Core.Events.ProjectOpenedEvent.Subscribe((p) => {

        Task.Run(() => {
            System.Threading.Thread.Sleep(10000);
            FrameworkApplication.Current.Dispatcher.Invoke(() =>
            {
                //相关的控件控制
            });
        });
    });
}

这种方式更符合预期些,但在触发的时间上,需要在布局还原之后触发,由于Pro并没有提供相应的事件,比较难精准的控制。我这里采用了固定时长的异步等待的方式,但不是个很好的方案,最好尝试其他更为合适的事件,并结果状态验证,来进行更准确的控制。

相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义

随笔 - 119, 文章 - 0, 评论 - 3, 阅读 - 4066

Copyright © 2025 云起
Powered by .NET 9.0 on Kubernetes

点击右上角即可分享
微信分享提示