Владимир П, добрый день.
Я пока не понял, какие именно две части Вы хотите сшить вместе. Как я понял, что Вы желаете видеть в одном плагине и формы WinForms и формы из WPF? Я правильно Вас понимаю? Если нет, то прошу поправить меня.
По созданию плагина под Revit с помощью WPF алгоритм будет следующим:
1. Создаём приложение WPF.
2. Затем меняем тип приложения на «WPF библиотека классов».
3. Затем добавляем изображение (48x48), которая будет играть роль кнопки закрытия формы WPF (назовите её для примера «close 48.png»).
4. Удаляем Application.xaml.
5. Подключаем ссылки на библиотеки: RevitAPI.dll, RevitAPIUI.dll, (убедитесь, что System.Data.DataSetExtensions,
System.Windows.Forms, System.Xaml тоже присутствуют)
6. У всех ссылок свойство «Копировать локально = False».
7. В модуле MainWindow.xaml поставьте код:
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" Background="Transparent"
AllowsTransparency="True" WindowStyle="None"
WindowStartupLocation="CenterScreen" ResizeMode="CanResizeWithGrip" >
<Grid>
<Rectangle Fill="Transparent" Stroke="#FFFB2E00" StrokeThickness="3"/>
<Rectangle Stroke="#FF002040" Opacity="0.6" StrokeMiterLimit="0" Margin="0,0,0,-5"
StrokeThickness="0">
<Rectangle.Effect>
<DropShadowEffect x:Name="DS" BlurRadius="25" ShadowDepth="0" Color="Black" />
</Rectangle.Effect>
<Rectangle.Fill>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FF05121F" Offset="0"/>
<GradientStop Color="#FF2A74BD" Offset="1"/>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
<Rectangle x:Name="TitleBar" Height="40" Stroke="#FF002040" VerticalAlignment="Top"
StrokeThickness="3" Fill="#FF05121F" Opacity="0.7"/>
<Button Content="Button" HorizontalAlignment="Left" Height="44" Margin="21,55,0,0"
VerticalAlignment="Top" Width="232" Background="#FFF73901"
BorderBrush="#FF052B91" BorderThickness="3" Click="Button_Click">
<Button.Effect>
<DropShadowEffect BlurRadius="15" Color="#FFA83104"/>
</Button.Effect>
</Button>
<Image Height="28" Margin="0,7,7,0" VerticalAlignment="Top" HorizontalAlignment="Right"
Width="28" Source="close 48.png"
MouseDown="Image_MouseDown"/>
</Grid>
</Window>
8. В событии Image (кнопки, для которой Вы загрузили изображение), а именно MouseDown дважды кликаем в поле Image_MouseDown и откроется модуль MainWindow.xaml.vb, в котором мы всё напрочь удаляем и вставляем код:
Imports Autodesk.Revit
Imports Autodesk.Revit.UI
Imports Autodesk.Revit.DB
Imports System
Imports System.Windows.Forms
Imports System.Text
Class MainWindow
Private myCD As ExternalCommandData
Public Sub New(ByVal commandData As ExternalCommandData)
MyBase.New()
InitializeComponent()
myCD = commandData
End Sub
Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
Dim App As Autodesk.Revit.UI.UIApplication = myCD.Application
MsgBox(App.Application.VersionNumber)
End Sub
Private Sub TitleBar_MouseDown(sender As Object, e As MouseButtonEventArgs) Handles
TitleBar.MouseDown
Me.DragMove()
End Sub
Private Sub Image_MouseDown(sender As Object, e As MouseButtonEventArgs)
Me.Close()
End Sub
End Class
9. Создаём класс WPF_Form_Show.vb
<Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.ReadOnly)> _
Public Class WPF_Form_Show
Implements Autodesk.Revit.UI.IExternalCommand
Public Function Execute(ByVal commandData As Autodesk.Revit.UI.ExternalCommandData, _
ByRef message As String, ByVal elements As Autodesk.Revit.DB.ElementSet) _
As Autodesk.Revit.UI.Result Implements Autodesk.Revit.UI.IExternalCommand.Execute
Dim myNewForm As New MainWindow(commandData)
myNewForm.ShowDialog()
Return Autodesk.Revit.UI.Result.Succeeded
End Function
End Class
10. Собираем сборку и копируем путь к сборке в буфер, нажав «Ctrl+C».
11. Переходим в папку «%Appdata%\Autodesk\Revit\Addins\2017» (у кого какая версия Revit-а)
12. Создаем в папке файл «Revit_WPF.addin»
<?xml version="1.0" encoding="utf-8"?>
<RevitAddIns>
<AddIn Type="Command">
<Name>Revit WPF Form</Name>
<FullClassName>ИМЯ_ВАШЕГО_ПРОЕКТА_БИБЛИОТЕКИ.WPF_Form_Show</FullClassName>
<Assembly>Полный путь к сборке</Assembly>
<AddInId>94bc2dbd-560b-4669-9a92-dda4d11bdb6d</AddInId>
<VendorId>Gallurgy</VendorId>
<VendorDescription>ОАО Галургия, www.gallurgy.ru</VendorDescription>
</AddIn>
</RevitAddIns>
Результат Вам должен понравиться.
Если Вам потребуется иметь возможность использовать в одном плагине и формы WPF и WinForms, то тут алгоритм немного будет расширенным, но результат будет похож на это: