Мне не известны какие-либо элементы управления, которые позволяют вам это делать, но это не сложно сделать самостоятельно. Самый простой способ - создать диалоговую оболочку, пользовательский элемент управления, который выступает в качестве базового класса для опций «панелей», один (или более) атрибут для управления именем и информацией о группировке, а также интерфейс (который реализует пользовательский элемент управления) .
Каждая из ваших пользовательских панелей параметров основана на пользовательском элементе управления и переопределяет какой-либо метод Initialize()
и Save()
(предоставляется пользовательским элементом управления). Он также предоставляет ваш атрибут (или атрибуты), которые определяют имя / информацию о группировке.
В диалоговой оболочке осмотрительно осмотрите все открытые типы из вашей сборки (или всех загруженных сборок) в поисках типов, реализующих ваш интерфейс. Когда вы найдете тип, получите атрибуты, чтобы определить, где разместить его в вашей группе (проще всего здесь использовать древовидное представление), вызвать Activator.CreateInstance
, чтобы создать экземпляр пользовательского элемента управления и сохранить его в Tag
имущество. Когда пользователь нажимает на запись в группе (узел дерева), получите Tag
и установите панель, которая содержит пользовательский элемент управления, для объекта в свойстве Tag
. Наконец, когда пользователь нажимает «ОК» в диалоговом окне, перебирает узлы дерева, получает свойство Tag
и вызывает метод Save
.
Обновление:
Другой вариант - использовать элемент управления сеткой свойств. У него нет «симпатичного» интерфейса, но он очень функциональный, уже поддерживает группирование по атрибуту категории и обеспечивает большую гибкость. Вы можете использовать единую сетку свойств, которая показывает все параметры, или использовать «гибридный» подход с древовидным представлением, которое группирует по основным функциям (плагин, возможности и т. Д.), Вероятно, в зависимости от типа. Когда пользователь щелкает этот узел, присвойте сетке свойств экземпляр объекта. Единственным недостатком этого подхода является то, что при внесении изменений в значения сетки свойств они являются «живыми», поскольку базовое свойство немедленно изменяется, что означает отсутствие концепции «Отмена», за исключением сохранения копии каждого значения, которое может изменить и выполнить какой-то тип «перезагрузки» самостоятельно.