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

ADN Club => AutoCAD .NET API => Тема начата: avc от 01-06-2021, 12:39:23

Название: Событие перехода фокуса из палитры в чертеж
Отправлено: avc от 01-06-2021, 12:39:23
Что-то я затупил на простейшем моменте. В палитру Автокада вставлен мой контрол UserControl (WinForms) со всякими TextBox и т.п.. Надо сохранить изменения, когда пользователь закончил ввод и перенес мышь на чертеж или когда кликнул по чертежу. Проблема в том что мой контрол не получает вообще никаких событий: ни Leave, ни MouseLeave, ни Validated.
При этом я вижу, что из TextBox исчезает курсор. То есть контрол все таки знает, что потерял фокус ввода. В событиях документа или эдитора тоже не вижу события активации чертежа. События DocumentManager_DocumentActivated не происходит.
Не хотелось бы заставлять пользователя делать лишний клик на кнопку "Save"...
Название: Re: Событие перехода фокуса из палитры в чертеж
Отправлено: Александр Ривилис от 01-06-2021, 13:14:47
Надо сохранить изменения, когда пользователь закончил ввод и перенес мышь на чертеж или когда кликнул по чертежу
Ну клик по чертежу можешь через Editor.PointMonitor получить. А событие потери фокуса наверное через Autodesk.AutoCAD.Windows.PaletteSet.Focused или Autodesk.AutoCAD.Windows.PaletteSet.PaletteActivated
Название: Re: Событие перехода фокуса из палитры в чертеж
Отправлено: avc от 01-06-2021, 13:37:27
Focused вызывается только по клику на заголовке палитры. Вход в TextBox на палитре не отслеживается вообще, выход "в чертеж" тоже.
PaletteActivated не вызывается никогда. Не понял в чем прикол. Может это для случая, когда несколько палитр склеены в один набор.
Но похоже я решил проблему. Сохраняюсь по Doc_CommandWillStart. Раз запущена команда - значит пользователь уже "ушел" из палитры. Это конечно будет тормозить всю работу пользователя, если сохранение окажется долгим... Посмотрю еще на PointMonitor...
Название: Re: Событие перехода фокуса из палитры в чертеж
Отправлено: Дмитрий Загорулькин от 02-06-2021, 11:49:47
В WPF я для этого отслеживал событие потери фокуса клавиатуры: https://docs.microsoft.com/ru-ru/dotnet/api/system.windows.input.keyboard.lostkeyboardfocus?view=net-5.0
Может быть, в WinForm есть что-то похожее.
P.S. Хотя, тут немного не так. Я отслеживал это событие, чтобы обновить привязанное свойство объекта ViewModel. А изменение этого свойства уже вызывало действия с БД чертежа.
Название: Re: Событие перехода фокуса из палитры в чертеж
Отправлено: avc от 02-06-2021, 12:16:30
В WinForms нет понятия фокуса "ввода с клавиатуры" и соответствующих событий. Есть просто Focus и события входа и выхода в контрол. думаю, это все одно и тоже, так как никакого другого фокуса, кроме как для ввода с клавиатуры, я не могу вообразить :) Но вот событие выхода Leave вызывается только при переходах в пределах формы. Это большая проблема для всех немодальных форм и для палитр Автокада тоже. Явная недоделка Microsoft...
Название: Re: Событие перехода фокуса из палитры в чертеж
Отправлено: Дмитрий Загорулькин от 02-06-2021, 12:45:23
Но вот событие выхода Leave вызывается только при переходах в пределах формы.
Судя по комментариям этой статьи (https://docs.microsoft.com/ru-ru/dotnet/api/system.windows.forms.control.leave?view=netframework-4.8), Leave при выходе из формы подавляется событиями формы.
Может, попробовать пройтись в отладке или декомпилятором вверх по иерархии от контрола до палитры и поискать объект, у которого будет нужное событие? Там же не форма основной объект, вроде, а какой-то WinFormHost. Может у него что-то такое будет?
Название: Re: Событие перехода фокуса из палитры в чертеж
Отправлено: avc от 02-06-2021, 13:05:39
Да нет, там про другое. Имеется ввиду, что форма подменяет Leave на Deactivate. Но Deactivate это тоже не происходит, как и Validated. Да и нет у меня форм, в палитре наследник UserControl и он ничего не подменяет. Но в статье упоминается некая WM_KILLFOCUS... Вот это я пожалуй погуглю...