背景
在工作中,总会遇到让我们添加一个类似“属性”的窗口,可以任意吸附在Revit界面上的窗口(如下图)。开始撸代码~~~
界面
- 可停靠窗口使用的是page界面(如下图)
- 但是这里存在一个问题,我们一般revit开发项目都是使用类库,点击添加的时候,只会有一个选项,并没有页的选项(如下图)。
- 这里提供两个解决方法,一个是生成UserControl界面后,再Xaml界面把UserControl改成Page
修改后
- 第二种方法可以去看我转载的文章,在项目文件中添加WPF的选项(这里就不重复赘述了)
接口(IDockablePaneProvider)
Revit 中的可停靠窗口需要继承IDockablePaneProvider接口,然后再接口的SetupDockablePane(DockablePaneProviderData data)方法中,实现对可停靠窗口的生成布置。
public void SetupDockablePane(DockablePaneProviderData data)
{
data.FrameworkElement = this as FrameworkElement;
data.InitialState = new DockablePaneState();
data.InitialState.DockPosition = DockPosition.Top;
}
data.InitialState.DockPosition 是枚举值,可以指定窗口打开的时候,初始化位置是在那个地方。我这里选择是放在上面
依赖注入
定义好界面后,我们需要去Revit程序的入口里面去注册我们的窗口
namespace RevitTest
{
public class App : IExternalApplication
{
public Result OnShutdown(UIControlledApplication application)
{
return Result.Succeeded;
}
public Result OnStartup(UIControlledApplication application)
{
//添加一个按钮
RibbonPanel ribbonPanel = application.CreateRibbonPanel("test");
PushButton pushButton2 = ribbonPanel.AddItem(new PushButtonData("test", "test",typeof(App).Assembly.Location, typeof(ShowDockablePlabe).FullName)) as PushButton;
DockablePaneId id = new DockablePaneId(new Guid("8D8735A1-E8E8-416D-9B08-4FE7D74C9FB0"));
PageView mpp = new PageView(application);
application.RegisterDockablePane(id, "MyPane", mpp);
return Result.Succeeded;
}
}
}
命令控制显示
namespace RevitTest.PageDemo
{
[Transaction(TransactionMode.Manual)]
public class ShowDockablePlabe : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIApplication uiapp = commandData.Application;
DockablePane dp = uiapp.GetDockablePane(new DockablePaneId(new Guid("8D8735A1-E8E8-416D-9B08-4FE7D74C9FB0")));
dp.Show();
return Result.Succeeded;
}
}
}
这里需要注意的是,调用的Guid和注入的Guid必须是一样的才可以**
使用Addin的方式调用,点击按钮可以自动弹出界面
后续深入研究
现在我们只是实现了界面的显示,但是没有实现数据的交互。一般会根据需求,添加闲时事件来绑定对revit里面的数据经行修改。也可以通过闲时事件+外部事件组合的方式来操作Revit。但是都不是在这次的讨论范围内。后续会更新闲时事件和外部事件的相关文章,敬请关注~~~