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个窗体),可以使用如下的方式实现。
5011 0
Revit 二次开发添加WPF窗口的办法
Revit 二次开发添加WPF窗口的办法
Revit 二次开发添加WPF窗口的办法
Qt自定义界面类并提升(提升的窗口部件)
Qt自定义界面类并提升(提升的窗口部件)
1387 0
Qt自定义界面类并提升(提升的窗口部件)
|
数据安全/隐私保护
delphi 实现可移动异形窗体(附项目文件)
源码下载地址:http://yunpan.cn/cFsrRxJLcn3Ex 访问密码 6294
321 0
delphi 实现可移动异形窗体(附项目文件)
|
XML 程序员 C语言
Qt编写控件属性设计器2-拖曳控件
一、前言 上一篇文章把插件加载好了,并且把插件中的所有控件都显示到了列表框中,这次要做的就是实现拖曳控件的功能,用户选择一个控件拖曳到画布上,松开,在松开位置处自动实例化该控件,这个需要用到dropEvent和dragEnterEvent事件,重新实现这两个事件,对拖曳的对象进行过滤并调用函数实例化该控件,在实例化该控件的同时实例化控件跟随控件以便拉伸调整大小和位置。
920 0
|
Windows
背水一战 Windows 10 (73) - 控件(控件基类): UIElement - 拖放的基本应用, 手动开启 UIElement 的拖放操作
原文:背水一战 Windows 10 (73) - 控件(控件基类): UIElement - 拖放的基本应用, 手动开启 UIElement 的拖放操作 [源码下载] 背水一战 Windows 10 (73) - 控件(控件基类): UIElement - 拖放的基本应用, 手动开启 UIEle...
1156 0