В настоящее время я работаю над проектом, в котором моя часть заключается в разработке рабочей поверхности, в которой конечный пользователь может добавлять / удалять / перемещать элементы управления во время выполнения.
Я следовал этому уроку "Хостинг дизайнеров Windows Forms Тима Доусона" и почти реализовал все необходимые мне функции.
Рассказ для тех, кто не хочет читать учебник: Я реализовал IDesignerHost
, IContainer
, ISelectionService
, IToolboxService
и некоторые другие интерфейсы для создания моей поверхности дизайна. Я не использовал System.ComponentModel.Design.DesignSurface
уже в фреймворке, в основном потому, что мне нужна действительно нестандартная поверхность дизайна.
Вопрос:
Я хочу разрешить пользователю перетаскивать новые Control
из IToolboxService
в IDesignerHost/IContainer
. В этом руководстве вы нажимаете Control
на панели инструментов, щелкаете мышью по области конструктора, чтобы добавить элемент управления.
Что я нашел:
- Существует встроенная функция, которая
автоматически перетаскивает из
IToolboxService
до
System.ComponentModel.Design.DesignSurface
но это явно не работает, если вы реализуете IDesignerHost из ничего.
Когда вы используете
Control.DoDragDrop(ToolboxItem)
метод, чтобы инициировать перетаскивание:
IToolboxService.SerializeToolboxItem(ToolboxItem)
вызывается для сериализации элемента
IToolboxService.IsToolboxItem(object)
и
IToolboxService.IsSupported(object)
Вызваны для оценки, если
сериализованный ToolboxItem может быть разрешен
быть уроненным на поверхность дизайна
- Когда вы отбрасываете элемент управления:
IToolboxService.DeserializeToolboxItem(object serializedObject)
вызывается конструкторской поверхностью для десериализации свернутого элемента.
IToolboxService.SetCursor()
вызывается, чтобы узнать, определяете ли вы пользовательский курсор или разрешаете стандартный курсор Windows.
Проблема:
Я реализовал все, что упомянуто выше, в «Что я нашел», но перетаскивание глючит:
- тащу, все нормально, но когда
парить поверхность дизайна, мой
курсор мигает немного между
стандартный курсор и
Стиль "
DragDropEffects.Copy
".
- Когда я перетаскиваю, ничего не происходит, и когда мой курсор покидает поверхность дизайна (после того, как я уронил), тогда создается новый
Control
, который добавляется туда, где я его уронил.
Кто-нибудь когда-нибудь пытался делать то, что я делаю, и если да, то как тебе это удалось?
Есть ли у кого-нибудь указатель / ссылка / хорошие советы?
Спасибо =)