在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并没有提供相应的事件,比较难精准的控制。我这里采用了固定时长的异步等待的方式,但不是个很好的方案,最好尝试其他更为合适的事件,并结果状态验证,来进行更准确的控制。