Не удается инициализировать окно WPF из Revit ExternalCommand - PullRequest
0 голосов
/ 25 августа 2018

Я делаю надстройку 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 передается в представление вместо модели представления.

1 Ответ

0 голосов
/ 25 августа 2018

оказалось, что мое подозрение верное, thisApp, будучи нулевым, действительно заставило Revit выдать исключение, чтобы исправить это, я запускаю новый экземпляр класса thisApplication, а затем вызываю метод ShowWindow.и он делает то, что я ожидал.

public virtual Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
    {
        try
        {
            new ThisApplication().ShowWindow(commandData.Application);

            return Result.Succeeded;
        }
        catch (Exception ex)
        {
            message = ex.Message;
            return Result.Failed;
        }
    }

Спасибо @Dai, за ваше предложение.

...