Revit二次开发知识分享(二十二)可停靠窗口 Page

背景

在工作中,总会遇到让我们添加一个类似“属性”的窗口,可以任意吸附在Revit界面上的窗口(如下图)。开始撸代码~~~
Revit二次开发知识分享(二十二)可停靠窗口 Page_第1张图片

界面

  • 可停靠窗口使用的是page界面(如下图)
    Revit二次开发知识分享(二十二)可停靠窗口 Page_第2张图片
  • 但是这里存在一个问题,我们一般revit开发项目都是使用类库,点击添加的时候,只会有一个选项,并没有页的选项(如下图)。
    Revit二次开发知识分享(二十二)可停靠窗口 Page_第3张图片
  • 这里提供两个解决方法,一个是生成UserControl界面后,再Xaml界面把UserControl改成Page
    Revit二次开发知识分享(二十二)可停靠窗口 Page_第4张图片
    Revit二次开发知识分享(二十二)可停靠窗口 Page_第5张图片

修改后

Revit二次开发知识分享(二十二)可停靠窗口 Page_第6张图片
Revit二次开发知识分享(二十二)可停靠窗口 Page_第7张图片

  • 第二种方法可以去看我转载的文章,在项目文件中添加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程序的入口里面去注册我们的窗口
Revit二次开发知识分享(二十二)可停靠窗口 Page_第8张图片

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二次开发知识分享(二十二)可停靠窗口 Page_第9张图片

后续深入研究

现在我们只是实现了界面的显示,但是没有实现数据的交互。一般会根据需求,添加闲时事件来绑定对revit里面的数据经行修改。也可以通过闲时事件+外部事件组合的方式来操作Revit。但是都不是在这次的讨论范围内。后续会更新闲时事件和外部事件的相关文章,敬请关注~~~

你可能感兴趣的:(Revit二次开发知识分享,1024程序员节)