Обновление активности кнопки в RibbonPanels

Автор Тема: Обновление активности кнопки в RibbonPanels  (Прочитано 1947 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Павел Тер-МикаэлянАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 124
  • Карма: 5
Добрый день.
1) Запускаю форму (WindowsForms) со своим меню по нажатию на кнопку.
2) Чтобы нельзя было запустить 2 формы, при загрузке формы делаю активность кнопки Enabled=false. Когда закрываю форму делаю активность кнопки Enabled=true.
Вопрос: Кнопка становится снова активной только если нажать на нее или на панель. Я так понимаю, что нужен какой-то апдейт состояния меню в случае активности какой-то сторонней формы. Как это сделать, подскажите пожалуйста?

Отмечено как Решение Павел Тер-Микаэлян 25-01-2018, 18:37:45

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Если вы используете немодальное окно, которое не блокирует работу ревита, то ваша проблема решается совсем иным путем. Причем, достаточно простым и правильным! Нужно создать статический экземпляр вашего окна и работать только с ним. В случае, если окно уже открыто, делать его активным. Вот пример:
Код - C# [Выбрать]
  1. /// <summary>Стартер функции. Позволяет работать с немодальным окном
  2. /// функции только в одном экземпляре</summary>
  3. public static class FunctionStarter
  4. {
  5.     private static ExcelImports _mainWindow;
  6.  
  7.     public static void Start(UIApplication uiApplication)
  8.     {
  9.         if (_mainWindow != null)
  10.             _mainWindow.Activate();
  11.         else
  12.         {
  13.             _mainWindow = new ExcelImports();
  14.             _mainWindow.Closed += _mainWindow_Closed;
  15.             _mainWindow.Show();
  16.         }
  17.     }
  18.  
  19.     private static void _mainWindow_Closed(object sender, EventArgs e)
  20.     {
  21.         _mainWindow = null;
  22.     }
  23. }

В методе Execute просто вызываете метод Start:
Код - C# [Выбрать]
  1. public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
  2. {
  3.     try
  4.     {
  5. UG
  6.         PluginStatistic.Writer.WriteCommand(this, commandData);
  7.  
  8.         if (commandData.Application.ActiveUIDocument.Document.IsFamilyDocument)
  9.         {
  10.             MessageBox.Show("Для запуска функции перейдите в проект");
  11.             return Result.Cancelled;
  12.         }
  13.  
  14.         FunctionStarter.Start(commandData.Application);
  15.  
  16.         return Result.Succeeded;
  17.     }
  18.     catch (OperationCanceledException)
  19.     {
  20.         return Result.Cancelled;
  21.     }
  22.     catch (PluginException exception)
  23.     {
  24.         message = exception.Message;
  25.         return Result.Failed;
  26.     }
  27. }

И ненужно никаких изобретать велосипедов с лентой

Оффлайн Павел Тер-МикаэлянАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 124
  • Карма: 5
Спасибо большое, Александр) я просто думал, что Revit при нажатии на кнопку создаёт новый экземпляр класса ExternalComand, который знать ничего не знает про первый экземпляр и его форму. Уже думал через WinApi отлавливать)