IExternalEventHandler

Автор Тема: IExternalEventHandler  (Прочитано 4087 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн enotАвтор темы

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
IExternalEventHandler
« : 16-11-2019, 15:56:52 »
верно ли , что IExternalEventHandler можно создать только в классе IExternalApplication на стадии OnStartup ?

Оффлайн Вильдар

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Re: IExternalEventHandler
« Ответ #1 : 16-11-2019, 18:22:35 »
IExternalEventHandler это же интерфейс!
Можно создать клас - реализацию.

Основной момент тут:
Код - C# [Выбрать]
  1. eventer = ExternalEvent.Create(EventHandler);
где, EventHandler это и есть объект класса реализующего этот интерфейс  :o
и вызывать eventer.Raise() когда нужно что-то делать в ревите, при этом вызовится Execute() в объекте EventHandler.

А ответ на вопрос - нет  ;D

Оффлайн enotАвтор темы

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: IExternalEventHandler
« Ответ #2 : 16-11-2019, 18:36:46 »
тогда так.
если ревит запущен вы сможете создать ExternalEvent и выполнить его (Raise) ?
Пример. Цель создать команду (IExternalCommand для запуска из AddinManager) , которая выполнялась бы в контексте ревита

1) через AddinManager запускаем команду. Команда требует выполнения в контексте ревита. Ок. создаем тогда ExternalEvent  в этой команде . Тут же пробуем получить его для выполнения => получаем null

2) На стадии OnStartup создаем ExternalEvent  => проверяем - существует.

только в классе IExternalApplication
должно думаю работать еще если в манифесте прописать команду. Но это опять-таки перезапуск ревита нужен
« Последнее редактирование: 16-11-2019, 19:14:31 от enot »

Отмечено как Решение enot 03-09-2020, 22:16:20

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: IExternalEventHandler
« Ответ #3 : 17-11-2019, 10:37:03 »
Вот Вам рабочий пример:
Код - C# [Выбрать]
  1. [Transaction(TransactionMode.Manual)]
  2. public class TestCommand : IExternalCommand
  3. {
  4.         public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
  5.         {
  6.                 var handler = new TestEventHandler();
  7.  
  8.                 handler.Initialize();
  9.  
  10.                 System.Threading.Tasks.Task.Factory.StartNew(() =>
  11.                         {
  12.                                 Thread.Sleep(TimeSpan.FromSeconds(5));
  13.  
  14.                                 handler.Raise();
  15.                         });
  16.  
  17.                 TaskDialog.Show("dev", "handler created");
  18.  
  19.                 return Result.Succeeded;
  20.         }
  21. }
  22.  
  23. public class TestEventHandler : IExternalEventHandler
  24. {
  25.         private ExternalEvent externalEvent;
  26.  
  27.         public void Initialize()
  28.         {
  29.                 externalEvent = ExternalEvent.Create(this);
  30.         }
  31.  
  32.         public void Raise() => externalEvent.Raise();
  33.  
  34.         public void Execute(UIApplication app) => TaskDialog.Show("dev", "Hello");
  35.  
  36.         public string GetName() => nameof(TestEventHandler);
  37. }