Событие перехода фокуса из палитры в чертеж

Автор Тема: Событие перехода фокуса из палитры в чертеж  (Прочитано 7358 раз)

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

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

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Что-то я затупил на простейшем моменте. В палитру Автокада вставлен мой контрол UserControl (WinForms) со всякими TextBox и т.п.. Надо сохранить изменения, когда пользователь закончил ввод и перенес мышь на чертеж или когда кликнул по чертежу. Проблема в том что мой контрол не получает вообще никаких событий: ни Leave, ни MouseLeave, ни Validated.
При этом я вижу, что из TextBox исчезает курсор. То есть контрол все таки знает, что потерял фокус ввода. В событиях документа или эдитора тоже не вижу события активации чертежа. События DocumentManager_DocumentActivated не происходит.
Не хотелось бы заставлять пользователя делать лишний клик на кнопку "Save"...

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Надо сохранить изменения, когда пользователь закончил ввод и перенес мышь на чертеж или когда кликнул по чертежу
Ну клик по чертежу можешь через Editor.PointMonitor получить. А событие потери фокуса наверное через Autodesk.AutoCAD.Windows.PaletteSet.Focused или Autodesk.AutoCAD.Windows.PaletteSet.PaletteActivated
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Focused вызывается только по клику на заголовке палитры. Вход в TextBox на палитре не отслеживается вообще, выход "в чертеж" тоже.
PaletteActivated не вызывается никогда. Не понял в чем прикол. Может это для случая, когда несколько палитр склеены в один набор.
Но похоже я решил проблему. Сохраняюсь по Doc_CommandWillStart. Раз запущена команда - значит пользователь уже "ушел" из палитры. Это конечно будет тормозить всю работу пользователя, если сохранение окажется долгим... Посмотрю еще на PointMonitor...

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
В WPF я для этого отслеживал событие потери фокуса клавиатуры: https://docs.microsoft.com/ru-ru/dotnet/api/system.windows.input.keyboard.lostkeyboardfocus?view=net-5.0
Может быть, в WinForm есть что-то похожее.
P.S. Хотя, тут немного не так. Я отслеживал это событие, чтобы обновить привязанное свойство объекта ViewModel. А изменение этого свойства уже вызывало действия с БД чертежа.

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

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
В WinForms нет понятия фокуса "ввода с клавиатуры" и соответствующих событий. Есть просто Focus и события входа и выхода в контрол. думаю, это все одно и тоже, так как никакого другого фокуса, кроме как для ввода с клавиатуры, я не могу вообразить :) Но вот событие выхода Leave вызывается только при переходах в пределах формы. Это большая проблема для всех немодальных форм и для палитр Автокада тоже. Явная недоделка Microsoft...

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Но вот событие выхода Leave вызывается только при переходах в пределах формы.
Судя по комментариям этой статьи, Leave при выходе из формы подавляется событиями формы.
Может, попробовать пройтись в отладке или декомпилятором вверх по иерархии от контрола до палитры и поискать объект, у которого будет нужное событие? Там же не форма основной объект, вроде, а какой-то WinFormHost. Может у него что-то такое будет?

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

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Да нет, там про другое. Имеется ввиду, что форма подменяет Leave на Deactivate. Но Deactivate это тоже не происходит, как и Validated. Да и нет у меня форм, в палитре наследник UserControl и он ничего не подменяет. Но в статье упоминается некая WM_KILLFOCUS... Вот это я пожалуй погуглю...