Если вы используете немодальное окно, которое не блокирует работу ревита, то ваша проблема решается совсем иным путем. Причем, достаточно простым и
правильным! Нужно создать статический экземпляр вашего окна и работать только с ним. В случае, если окно уже открыто, делать его активным. Вот пример:
/// <summary>Стартер функции. Позволяет работать с немодальным окном
/// функции только в одном экземпляре</summary>
public static class FunctionStarter
{
private static ExcelImports _mainWindow;
public static void Start(UIApplication uiApplication)
{
if (_mainWindow != null)
_mainWindow.Activate();
else
{
_mainWindow = new ExcelImports();
_mainWindow.Closed += _mainWindow_Closed;
_mainWindow.Show();
}
}
private static void _mainWindow_Closed(object sender, EventArgs e)
{
_mainWindow = null;
}
}
В методе Execute просто вызываете метод Start:
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
try
{
UG
PluginStatistic.Writer.WriteCommand(this, commandData);
if (commandData.Application.ActiveUIDocument.Document.IsFamilyDocument)
{
MessageBox.Show("Для запуска функции перейдите в проект");
return Result.Cancelled;
}
FunctionStarter.Start(commandData.Application);
return Result.Succeeded;
}
catch (OperationCanceledException)
{
return Result.Cancelled;
}
catch (PluginException exception)
{
message = exception.Message;
return Result.Failed;
}
}
И ненужно никаких изобретать велосипедов с лентой