Revit二次開發DockableDialog (可停靠窗體)
阿新 • • 發佈:2019-01-01
三個步驟
1、首先可停靠窗體為 Page 窗體,即WPF控制元件需繼承自Page。此外還需繼承 IDockablePaneProvider 介面,然後在WPF控制元件後臺程式碼彙總實現函式SetupDockablePane。
2、在IExternalApplication的OnStartup函式中完成註冊(RegisterDockablePane)可停靠視窗,同時新增一個Revit命令按鈕。
3、在IExternalCommand裡呼叫Page視窗, uiapp.GetDockablePane(dockablepaneid),然後dockablepane.Show()。
注:如果想要實現在Revit裡選擇一個構件,然後在可停靠窗口裡顯示一些資訊,可以用空閒事件來實現。
程式碼如下:
<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