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

背景

在工作中,总会遇到让我们添加一个类似“属性”的窗口,可以任意吸附在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。但是都不是在这次的讨论范围内。后续会更新闲时事件和外部事件的相关文章,敬请关注~~~

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

baobao熊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值