Поддерживает ли Visual Studio WinForms элементы управления без окон? - PullRequest
5 голосов
/ 21 ноября 2011

Должен ли каждый элемент управления в панели инструментов Visual Studio WinForms происходить из Control?

Поддерживает ли Visual Studio элементы управления без окон?


Каждый элемент управления, добавляемый в панель инструментов вVisual Studio:

enter image description here

must 1 происходит от Control, который является оберткой вокруг с окном control.

К сожалению, оконные элементы управления очень «тяжелые»;их большое количество, особенно вложенное, приводит к снижению производительности в WinForms.

В прошлом я решал эту проблему путем создания совокупных пользовательских элементов управления.Внутренний пользовательский элемент управления содержит другие безоконные элементы управления:

  • изображение (безоконный вариант PictureBox)
  • метка заголовка (безоконный вариант Label)
  • метка субтитров (безоконный вариант Label)
  • border (безоконный вариант Panel)

Они полезны для устранения проблем с производительностью в WinForms,но они застряли внутри кода.

Я хотел бы сделать то, что позволяют другие среды разработки, это версия Control, которая не создает окна Windows.Мне бы хотелось, чтобы в наборе инструментов Visual Studio могли принимать ** безоконные * элементы управления.

Я знаю, что если я действительно хотел безоконные элементы управления: я должен переключиться на WPF.Но это излишне.

Поддерживает ли Visual Studio WinForms элементы управления без окон?

1 или нет

1 Ответ

1 голос
/ 30 ноября 2011

Да и нет.

Во-первых, ознакомьтесь с этой статьей от почтенного Рэймонда Чена: http://blogs.msdn.com/b/oldnewthing/archive/2005/02/11/371042.aspx

Да. Вы можете создавать «элементы управления»которые не происходят от Control.Я создал несколько безоконных элементов управления в своем приложении, которые изначально поддерживают щелчки, наслоения и т. Д., Я рисую их в внеэкранный буфер, а затем рисую их непосредственно на каком-либо родительском Form или Control (например, PictureBox),Это легко сделать, но не просто, так как вам нужно будет управлять всем самостоятельно в коде.

Нет. Любые безоконные элементы управления не будут поддерживаться в конструкторе Windows Forms ни для одного изControl разработчики элементов управления (например, размещение их на панели или форме), поэтому у вас не будет перетаскивания дизайна формы.

Как указал Ганс, такими примерами являются ToolStrip и MenuStrip (элемент управления без окон).Обратите внимание, что когда вы создаете новый MenuStrip на Form, MenuStrip помещается в область компонентов под формой.MenuStrip имеет пользовательский набор классов Designer, связанных с ним, для поддержки пользовательского рисования и функциональности «Тип здесь», а также диалоговых окон для добавления и удаления пунктов меню.Обратите внимание, что «дочерние» безоконные элементы управления, такие как ToolStripButton, недоступны в панели инструментов для поддержки перетаскивания непосредственно в форму - об этом знает только пользовательский дизайнер.Пользовательский конструктор для MenuStrip также поддерживает выбор дочерних элементов управления без окон, чтобы вы могли редактировать свойства каждого элемента в окне «Свойства».

Не могу себе представить, что это подходит для вашей ситуации (если вы не создаете некоторые элементы управления для перепродажи), но если вы очень решительны, вы можете создать дизайнерскую поддержку почти таким же образом для вашего набора элементов управления без окон:

  1. Создать классэто происходит от Component, который будет использоваться для управления вашими элементами управления без окон.Например, вы можете назвать этот класс WindowlessWidgetManager.После компиляции этот элемент управления появится в вашем наборе инструментов.WindowlessWidgetManager может содержать коллекцию ваших безоконных элементов управления и обеспечивать рисование и другую поддержку пользовательского интерфейса для холста, например Form или PictureBox.
  2. Создать класс конструктора, производный от ComponentDesigner, который поддерживаеттакие вещи, как добавление и удаление пользовательских элементов управления во время разработки.Для получения дополнительной информации см. http://msdn.microsoft.com/en-us/library/system.componentmodel.design.componentdesigner(v=VS.90).aspx

Это очень длительный процесс с множеством предостережений, но если это то, чего вы хотите достичь, функциональность есть.

...