Я использую C #, Winforms, VS 2017 Enterprise и полную .NET Framework 4.7.2.
[Секция TLDR в конце!]
Я интенсивно работал с пространством имен System.ComponentModel.Design
, чтобы создать работающий Visual Studio-подобный дизайнер Winforms. Настройка среды для такого дизайнера форм для конечного пользователя требует глубокого понимания объектов и интерфейсов в вышеупомянутом пространстве имен (и как их всех соединить), а также компонентов панели инструментов и сетки свойств. Поэтому я не могу опубликовать образец кода. Этот вопрос требует знания класса DesignSurface
(https://docs.microsoft.com/en-us/dotnet/api/system.componentmodel.design.designsurface?view=netframework-4.7.2).
Кажется, что в области конструктора не возникает событие, когда пользователь перетаскивает выбранный элемент управления через поверхность конструктора. Мне нужно подключиться к событиям «begin-drag» / «end-drag», чтобы я мог выполнить очистку, а затем повторно визуализировать информационную панель, которая отражает текущую позицию всех элементов управления. (Я не хочу использовать таймеры для периодического обновления этой информации.)
Есть интерфейс ISelectionService
, который я реализовал. Но это дает информацию только о том, какие элементы управления / компоненты выбраны. Это не помогает зафиксировать событие, которое возникает, когда начинается или заканчивается операция перетаскивания элемента управления.
Подробная информация о событиях поверхности дизайна отображается здесь:
https://docs.microsoft.com/en-us/dotnet/api/system.componentmodel.design?view=netframework-4.7.2
Я пытался использовать событие IComponentChangeService's
ComponentChanged
, но оно срабатывает только после завершения операции перетаскивания элемента управления (и мне нужно определить, когда операция перетаскивания элемента управления начинается и заканчивается) ...
В качестве последнего средства я использовал Spy ++, чтобы увидеть, какие события возникают, когда элемент управления выбирается и перетаскивается по поверхности конструктора. Spy ++ помог мне идентифицировать начальное сообщение WM.LBUTTONDOWN
и различные сообщения о перемещении мыши и т. Д., Но использование этих сообщений потребовало бы большого дополнительного кодирования, чтобы гарантировать, что кнопка мыши была нажата на элементе управления на поверхности конструктора, что элемент управления был фактически выбран, и что кнопка мыши остается нажатой, и т. д. - и даже тогда, я все еще не был бы уверен, что элемент управления не изменен по сравнению с перемещением. Конечно, в идеале я бы хотел подключиться к логике конструктора, которая реагирует на событие drag-begin.
Наконец, мое требование - определить, когда перетаскивается один выбранный элемент управления или когда несколько выбранных элементов управления перетаскиваются как группа. В обоих случаях мне нужно знать, когда начинается перетаскивание и когда оно заканчивается. (Для ясности: я имею в виду элементы управления, которые уже находятся на поверхности конструктора - я не имею в виду элементы управления на панели инструментов, которые перетаскиваются на поверхность конструктора ...)
TLDR:
То, что я ищу, это способ подключиться к событию, которое срабатывает, как только элемент управления или группа элементов управления уже находятся на поверхности конструктора, перетаскивается, и способ подключиться к событию, которое срабатывает, когда эта операция перетаскивания имеет закончился.
Есть мысли?