Revit二次开发DockableDialog (可停靠窗体)

简介: Revit二次开发DockableDialog (可停靠窗体)

三个步骤


1、首先可停靠窗体为 Page 窗体,即WPF控件需继承自Page。此外还需继承 IDockablePaneProvider 接口,然后在WPF控件后台代码汇总实现函数SetupDockablePane。


2、在IExternalApplication的OnStartup函数中完成注册(RegisterDockablePane)可停靠窗口,同时添加一个Revit命令按钮。


3、在IExternalCommand里调用Page窗口, uiapp.GetDockablePane(dockablepaneid),然后dockablepane.Show()。


注:如果想要实现在Revit里选择一个构件,然后在可停靠窗口里显示一些信息,可以用空闲事件来实现。

20181219212434205.png

代码如下

<Page x:Class="DockableDialogsTest.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:DockableDialogsTest"
             Title="" Background="LightGray"
             Height="500" Width="200">
    <Grid>
        <Button Click="Button_Click" Width="50" Height="30">test</Button>    
    </Grid>
</Page>
namespace DockableDialogsTest
{
    /// <summary>
    /// UserControl1.xaml 的交互逻辑
    /// </summary>
    public partial class UserControl1 : Page, IDockablePaneProvider
    {
        public UserControl1()
        {
            InitializeComponent();
        }
        public void SetupDockablePane(DockablePaneProviderData data)
        {
            data.FrameworkElement = this as FrameworkElement;
            DockablePaneProviderData d = new DockablePaneProviderData();
            data.InitialState = new DockablePaneState();
            data.InitialState.DockPosition = DockPosition.Right;
        }
        private void Button_Click(object sender, RoutedEventArgs e)
        {
        }
    }
}

Make sure you do not reuse an existing GUID if you decide to copy and paste the code above.  


namespace DockableDialogsTest
{
    [Transaction(TransactionMode.Manual)]
    public class Command : IExternalCommand
    {
        public Result Execute(
          ExternalCommandData commandData,
          ref string message,
          ElementSet elements)
        {
            UIApplication uiapp = commandData.Application;
            UIDocument uidoc = uiapp.ActiveUIDocument;
            Application app = uiapp.Application;
            Document doc = uidoc.Document;
            string PageGuid = "321044f7-b0b2-4b1c-af18-e71a19252be0";
            UserControl1 page = new UserControl1();
            Guid guid = Guid.Empty;
            guid = new Guid(PageGuid);
            DockablePaneId paneId = new DockablePaneId(guid);
            DockablePane pane = uiapp.GetDockablePane(paneId);
            pane.Show();
            return Result.Succeeded;
        }
    }
}
namespace DockableDialogsTest
{
    public class App : IExternalApplication
    {
        static string AddInPath = typeof(App).Assembly.Location;
        public Result OnStartup(UIControlledApplication uiApp)
        {
            try
            {
                RibbonPanel ribbonPanel = uiApp.CreateRibbonPanel("test");
                //在新的Ribbon面板上添加pushButton2按钮
                PushButton pushButton2 = ribbonPanel.AddItem(new PushButtonData("test", "test",
                    AddInPath, "DockableDialogsTest.Command")) as PushButton;
                //给pushButton2按钮添加图片
                Uri uriImage2 = new Uri(@"E:\Revit Plug-in\DockableDialogsTest\DockableDialogsTest\Icon\red.png");
                BitmapImage largeImage2 = new BitmapImage(uriImage2);
                pushButton2.LargeImage = largeImage2;
                string PageGuid = "321044f7-b0b2-4b1c-af18-e71a19252be0";
                UserControl1 page = new UserControl1();
                Guid guid = Guid.Empty;
                guid = new Guid(PageGuid);
                DockablePaneId paneId = new DockablePaneId(guid);
                uiApp.RegisterDockablePane(paneId, "属性", (IDockablePaneProvider)page);
                return Result.Succeeded;
            }
            catch (Exception ex)
            {
                TaskDialog.Show("ERROR", ex.ToString());
                return Result.Failed;
            }
        }
        public Result OnShutdown(UIControlledApplication a)
        {
            return Result.Succeeded;
        }
    }
}

源代码地址

https://download.csdn.net/download/weixin_40626630/10862764


参考文章

http://blog.sina.com.cn/s/blog_e0020e2d0102yb4a.html


https://spiderinnet.typepad.com/blog/2014/10/revit-net-api-create-custom-dockable-pane-dockablepane-pt-1.html


https://www.cnblogs.com/huangkailang/p/5792960.html


https://blog.csdn.net/The_Eyes/article/details/52701173


相关文章
|
C# 编解码
WPF C# 多屏情况下,实现窗体显示到指定的屏幕内
原文:WPF C# 多屏情况下,实现窗体显示到指定的屏幕内 针对于一个程序,需要在两个显示屏上显示不同的窗体,(亦或N个显示屏N个窗体),可以使用如下的方式实现。
4973 0
基于C#的ArcEngine二次开发31:addin开发时调用ArcMap的进度条
基于C#的ArcEngine二次开发31:addin开发时调用ArcMap的进度条
基于C#的ArcEngine二次开发31:addin开发时调用ArcMap的进度条
Revit 二次开发添加WPF窗口的办法
Revit 二次开发添加WPF窗口的办法
Revit 二次开发添加WPF窗口的办法
|
数据安全/隐私保护
delphi 实现可移动异形窗体(附项目文件)
源码下载地址:http://yunpan.cn/cFsrRxJLcn3Ex 访问密码 6294
310 0
delphi 实现可移动异形窗体(附项目文件)
|
开发工具 C语言
Qt编写自定义控件6-指南针仪表盘
一、前言 指南针仪表盘,主要用来指示东南西北四个方位,双向对称两个指针旋转,其实就是360度打转,功能属于简单型,可能指针的绘制稍微难一点,需要计算多个点构成多边形,本系列控件文章将会连续发100+篇,一方面为了锻炼自己的毅力+坚持力,一方面为了宣传自己,如果各位对完整的源码有兴趣可以私聊,也欢迎...
1162 0
|
Web App开发 搜索推荐 C#
用WPF窗体打造个性化界面的图片浏览器
原文:用WPF窗体打造个性化界面的图片浏览器 本文使用WPF窗体(XAML及C#)与Win Form控件(FolderBrowserDialog)结合的方式, 演示制作了一个简易漂亮的WPF图片浏览器。
830 0
|
C# C++ Windows
WPF中不规则窗体与WindowsFormsHost控件的兼容问题完美解决方案
原文:WPF中不规则窗体与WindowsFormsHost控件的兼容问题完美解决方案          首先先得瑟一下,有关WPF中不规则窗体与WindowsFormsHost控件不兼容的问题,网上给出的解决方案不能满足所有的情况,是有特定条件的,比如  WPF中不规则窗体与WebBrowser控件的兼容问题解决办法。
1315 0
|
C#
WPF 控件库——仿制Windows10的进度条
原文:WPF 控件库——仿制Windows10的进度条 一、其实有现成的   先来看看Windows10进度条的两种模式:       网上有不少介绍仿制Windows10进度条的文章,也都实现了不错的效果。
1412 0