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