三个步骤
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
来源:CSDN
作者:专治BrIM
链接:https://blog.csdn.net/weixin_40626630/article/details/85107328