赞
踩
接着前面的预览控件和外部事件,这一篇,我们来看看可停靠窗口DockablePane
的实现。
可停靠窗口相关的类与接口主要有DockablePane
和IDockablePageProvider
,都是在UI
命名空间下。
Page
页,并实现IDockablePageProvider
接口;DockablePaneId
,需要传入一个Guid
,所以最好建立一个映射表;IExteranlApplication
)中注册该窗口,使用UIControlledApplication.RegisterDockablePane(..)
方法;uiApp.GetDockablePane(dpId)
方法检索到可停靠窗体,调用Show()
显示窗体。先实现,后面再讲讲我个人测试的遇到的问题。
本例想接着用上一篇用到的预览窗体界面,但Revit启动时显然是没有View
的,就算了。
XAML
:新建一个叫"DockablePage"的Page
,里头随便放些东西。记得要实现IDockablePageProvider
接口。
IExternalApplication
:在外部应用启动时注册。
[Transaction(TransactionMode.Manual)] [Journaling(JournalingMode.NoCommandData)] public class Application : IExternalApplication { public Result OnStartup(UIControlledApplication application) { this.RegisterDockablePane(application); return Result.Succeeded; } public Result OnShutdown(UIControlledApplication application) { return Result.Succeeded; } private void RegisterDockablePane(UIControlledApplication application) { DockablePaneId dockablePaneId = new DockablePaneId(new Guid(Mapping.DockablePaneId)); // 生成ID application.RegisterDockablePane(dockablePaneId, "DockablePane", DockablePage.GetDockablePage()); // 进行注册 } }
IExternalCommand
:在外部命令中使用。[Transaction(TransactionMode.Manual)] [Journaling(JournalingMode.NoCommandData)] internal class DockablePaneCommand : IExternalCommand { public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { UIApplication uiApp = commandData.Application; DockablePaneId dockablePaneId = new DockablePaneId(new Guid(Mapping.DockablePaneId)); // 创建ID,根据ID查找 //TaskDialog.Show("DockablePaneCommand", $"{DockablePane.PaneIsRegistered(dockablePaneId)}\r\n" + $"{DockablePane.PaneExists(dockablePaneId)}"); DockablePane dockablePane = uiApp.GetDockablePane(dockablePaneId); dockablePane.Show(); return Result.Succeeded; } }
至此,一个完整的可停靠窗口的Demo就完成了。
如果你了解Application
相关API,就能够知道UIControlledApplication
和UIApplication
的大部分类成员都是一样的,效果一样。不了解没关系可以看这篇:5. Revit API: Application。
那么,就一定得在外部应用中注册?
是的,必须在外部应用中注册。
能不能在外部命令中,通过UIApplication注册呢?
答案是可以的,但是只能注册,无法显示。
DockablePane
类中有3个静态方法,通过传入DockablePaneId
进行检测。
方法 | 描述 |
---|---|
PaneIsBuiltIn(dpID) | 检测目标窗口是否为Revit内置窗口 |
PaneIsRegistered(dpID) | 检测目标窗口是否已注册 |
PaneExists(dpID) | 检测目标窗口是否已创建 |
通过这三个方法,可以得到结果:
注册位置 | 内置 | 已注册 | 已创建 |
---|---|---|---|
IExternalApplication | ❌ | ✔ | ✔ |
IExternalCommand | ❌ | ✔ | ❌ |
当在外部命令中注册,并调用Show()
方法时,会报错。
虽然API文档中写建议使用Page及其派生类。那我可偏要看看不用能咋样。
好吧,不用界面就黑了。
Window
不行,Page
和UserControl
都可以。Window是最高级别的UI元素,猜测非Window都可以。
下面是使用Window和UserControl的截图
可以
上面说了,最开始是想直接使用上一篇的界面,那上面就有ExternalEvent
,我测试了那个删除按钮还是有效的。
例子中创建了个表格,就是想从项目文档中获取信息,进行展示。就像Revit自带的那些窗口一样,内容可以变化,想想就很棒是不是,可惜不得行。
不知道,不会,没搞定
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/969910
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。