Переписать стандартные элементы управления, такие как редактирование, комбо и т. Д.? - PullRequest
1 голос
/ 08 мая 2009

У меня есть пользовательский элемент управления: это управляемый код, который подклассы System.Windows.Forms.Control.

Я хочу добавить такие элементы, как поля редактирования, списки выбора, поля со списком, переключатели и т. Д. В места на этом элементе управления. Простой способ сделать это - просто добавить экземпляры этих классов в коллекцию Controls, чтобы они стали дочерними элементами управления.

Добавление их в качестве дочерних элементов управления может создать некоторые тонкие проблемы, например:

  • IE 6 выбрать элементы управления (поле со списком) над меню

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

  • Есть ли другие потенциальные проблемы?

Когда я использую IE7 для отображения http://www.tizag.com/htmlT/htmlselect.php (например), который содержит поля со списком и т. Д., И когда я затем использую Spy ++, чтобы шпионить за IE7, когда я делаю это, я вижу только одно окно Экземпляр / control без дочерних элементов (имя класса «Internet Explorer_Server»).

Я предполагаю, что это означает, что в IE7 функциональность для отображения комбинированного окна встроена в сам элемент управления IE7, и что IE7 не использует стандартные элементы управления в качестве дочерних элементов управления.

Вопросы:

  • Лучше ли повторно использовать стандартные элементы управления в качестве дочерних элементов пользовательского элемента управления или переопределить функциональность стандартных элементов управления внутри самого пользовательского элемента управления?
  • Есть ли у вас какие-либо предостережения (предупреждения), относящиеся к какому-либо сценарию?
  • Если бы я хотел переопределить функциональность стандартных элементов управления в пользовательском элементе управления, знаете ли вы какой-либо существующий код (который реализует эту функцию), который я мог бы использовать повторно?

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


Редактировать

Я нашел полу-связанный вопрос: Как сделать элемент управления похожим на ComboBox с включенными визуальными стилями?

1 Ответ

2 голосов
/ 08 мая 2009

Да, Internet Explorer рисует элементы управления с помощью API тем Windows. Вы также можете сделать это, используя типы, определенные в пространстве имен System.Windows.Forms.VisualStyles.

Команда IE сделала это, чтобы избежать проблем с производительностью при наличии большого количества элементов управления, каждый из которых получает сообщения окна, на экране одновременно. Например, глядя на эту страницу StackOverflow.com, я вижу 30-40 элементов управления ярлыками ссылок, 10 кнопок или около того, 20+ ярлыков и т. Д.

Следует отметить, что программное обеспечение Zune, которое представляет собой управляемый код .NET, также использует пользовательские элементы управления; если вы попытаетесь использовать Spy ++ на любом из элементов управления, вы увидите, что они не являются настоящими элементами управления Win32. Вы можете использовать Reflector в программном обеспечении Zune, чтобы точно увидеть, что они делают. Если я правильно помню, они используют настраиваемую управляемую среду пользовательского интерфейса, которая включена в программное обеспечение Zune.

Что касается переписывания этих элементов управления с нуля, я думаю, что предстоит проделать огромную работу. Звучит проще, чем на самом деле.

...