Я делаю надстройку Revit, которая откроет окно WPF для взаимодействия с пользователем. Я последовал примеру немодального диалога в SDK. Я сделал свою программу по схеме MVVM. Однако при отладке программа продолжала выдавать исключение на шаге ExternalCommand: «ссылка на объект не установлена на экземпляр объекта» класс ExternalCommand выглядит следующим образом:
[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
class RevitCommand : IExternalCommand
{
public virtual Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
try
{
ThisApplication.thisApp.ShowWindow(commandData.Application);
return Result.Succeeded;
}
catch (Exception ex)
{
message = ex.Message;
return Result.Failed;
}
}
}
Пока класс ExternalApplication:
public class ThisApplication : IExternalApplication
{
//Class instance
internal static ThisApplication thisApp;
//Modeless instance
private MainWindow m_MainWindow;
public Result OnShutdown(UIControlledApplication application)
{
if (m_MainWindow != null && m_MainWindow.IsVisible)
{
m_MainWindow.Dispose();
}
return Result.Succeeded;
}
public Result OnStartup(UIControlledApplication application)
{
m_MainWindow = null; // no dialog needed yet; the command will bring it
thisApp = this; // static access to this application instance
return Result.Succeeded;
}
public void ShowWindow(UIApplication uiapp)
{
// If we do not have a dialog yet, create and show it
if (m_MainWindow == null )
{
RequestHandler handler = new RequestHandler();
ExternalEvent exEvent = ExternalEvent.Create(handler);
MyViewModel vmod = new MyViewModel(exEvent,handler);
m_MainWindow = new MainWindow();
m_MainWindow.DataContext = vmod;
m_MainWindow.Show();
}
}
}
Я подозреваю, что было сгенерировано исключение, поскольку thisApp
имеет значение null, но пример в SDK работает нормально. Единственное отличие состоит в том, что они использовали WinForm вместо WPF и ExternalEvent передается в представление вместо модели представления.