ADN Open CIS
Сообщество программистов Autodesk в СНГ

20/02/2016

Как отключить Ленту средствами .NET

Мне попался интересный вопрос на форуме AutoCAD .NET, заданный Pete Elliott:

Когда AutoCAD загружается, я вижу что мои панели выключены (серые) до того момента, когда он не закончит загружаться. Наша программа выполняет дополнительную загрузку данных после того, как AutoCAD попадает в состояние «простоя». Но если пользователь нажмёт одну из кнопок на панели до того, как все данные будут загружены, AutoCAD аварийно завершит свою работу. Есть ли способ отключить панели (как это делает AutoCAD) пока загрузка не выполнена, а затем включить их? Я не смог найти API, которое бы позволило это сделать. Приму любые предложения с благодарностью!

Мне кажется, что это будет полезно знать всем. Для сегодняшней статьи я буду считать, что под "Панелями " Pete имеет в виду Ленту. (Это мне подходит, так как я нашел способ как это сделать для Ленты, но я сделаю все возможное, чтобы опубликовать последующую статью для Панелей если в этом возникнет потребность.

Основной подход достаточно прост: вы получаете доступ к текущему "Набору палитр Ленты " при помощи класса RibbonServices (мы вызываем метод для создания новой Ленты, но обычно он возвращает существующую Ленту если вызывается из команды). Затем мы используем его, чтобы отключить "Элемент управления Ленты ", а также его фоновое отображение вкладок. Мы также отключим отображение всплывающих подсказок на то время, пока Лента отключена.

Вот C#-код, который выключает и включает Ленту при помощи команд DR и ER соответственно. Эти команды просто показывают как можно вызвать функцию EnableRibbon() из вашего собственного кода (вы вызываетеl EnableRibbon(false); перед началом инициализации и EnableRibbon(true); когда она завершена).

Код - C#: [Выделить]
  1. using Autodesk.AutoCAD.Runtime;
  2. using Autodesk.Windows;
  3.  
  4. namespace UserInterfaceManipulation
  5. {
  6.   public class Commands
  7.   {
  8.     private static bool _showTipsOnDisabled = false;
  9.  
  10.     [CommandMethod("DR")]
  11.     public static void DisableRibbonCommand()
  12.     {
  13.       EnableRibbon(false);
  14.     }
  15.  
  16.     [CommandMethod("ER")]
  17.     public static void EnableRibbonCommand()
  18.     {
  19.       EnableRibbon(true);
  20.     }
  21.  
  22.     public static void EnableRibbon(bool enable)
  23.     {
  24.       // Для начала убедимся, что Лента есть
  25.       // (если функция вызывается из команды, то в большинстве случаев
  26.       // мы получаем существующую Ленту)
  27.  
  28.       var rps = Autodesk.AutoCAD.Ribbon.RibbonServices.CreateRibbonPaletteSet();
  29.  
  30.       // Включаем или выключаем её
  31.  
  32.       rps.RibbonControl.IsEnabled = enable;
  33.  
  34.       if (!enable)
  35.       {
  36.         // Сохраняем текущее состояние "Показывать подсказки когда Лента выключена"
  37.         // и меняем её значение
  38.         _showTipsOnDisabled = ComponentManager.ToolTipSettings.ShowOnDisabled;
  39.         ComponentManager.ToolTipSettings.ShowOnDisabled = enable;
  40.       }
  41.       else
  42.       {
  43.         // восстанавливаем значение "Показывать подсказки когда Лента выключена"
  44.         ComponentManager.ToolTipSettings.ShowOnDisabled = _showTipsOnDisabled;
  45.       }
  46.  
  47.       // Включаем или выключаем фоновое отображение вкладок
  48.       rps.RibbonControl.IsBackgroundTabRenderingEnabled = enable;
  49.     }
  50.   }
  51. }

Вот эти две команды в действии:

 

Источник: http://through-the-interface.typepad.com/through_the_interface/2016/02/disabling-the-autocad-ribbon-using-net.html

Автор перевода: Александр Ривилис

Обсуждение: http://adn-cis.org/forum/index.php?topic=4287

Опубликовано 20.02.2016
Отредактировано 25.02.2016 в 16:25:43