Перечисление структур и классов для свойств во время разработки - PullRequest
1 голос
/ 30 июня 2010

Как я могу написать свои собственные структуры, которые можно использовать как свойство во время разработки?Мне нужно иметь возможность указать значение по умолчанию и выбрать список предопределенных структур для конструктора на выбор, во многом так же, как реализованы свойства цвета.

Кроме того, как я могуделать это с классами, как это делает шрифт?Как вы можете указать дополнительные свойства в окне свойств?


Я пишу пользовательский элемент управления, который имеет много различных элементов визуального типа, таких как цвета градиента, ширина, проценты и т. Д.Я хочу, чтобы все они были настраиваемыми, но также могли быть настроены одновременно с разными Styles.Я могу сделать это во время выполнения, создав свойство структуры Style и заставив его изменить все остальные свойства в установщике.Что бы я хотел, чтобы пользователи во время разработки могли выбирать заранее определенные Styles, такие как «Светло-синий», «Темно-серый» и т. Д., Каждый из которых будет устанавливать все другие свойства пользовательского интерфейса (градиенты,и т. д.) Если бы я мог отобразить все свойства пользовательского интерфейса в свойстве «Стиль», то же самое, что «Жирный» и «Курсив» в «Шрифте», это было бы идеально.


Код:

[Designer("System.Windows.Forms.Design.ParentControlDesigner, System.Design", typeof(IDesigner))] 
public partial class GradientPanel : UserControl
{
    public PanelStyle Style
    {
        get
        {
            return new PanelStyle()
            {
                BackgroundFade = this.BackgroundFade,
                EdgeColor = this.EdgeColor,
                BorderColor = this.BorderColor,
                EdgeWidth = this.EdgeWidth,
                LowerColor = this.LowerColor,
                UpperColor = this.UpperColor
            };
        }
        set
        {
            this.SuspendLayout();
            this.BackgroundFade = value.BackgroundFade;
            this.EdgeColor = value.EdgeColor;
            this.BorderColor = value.BorderColor;
            this.EdgeWidth = value.EdgeWidth;
            this.LowerColor = value.LowerColor;
            this.UpperColor = value.UpperColor;
            this.ResumeLayout();
        }
    }

    ....

    public struct PanelStyle
    {
        public float BackgroundFade;
        public Color EdgeColor;
        public int EdgeWidth;
        public Color BorderColor;
        public Color UpperColor;
        public Color LowerColor;

        public static PanelStyle System = new PanelStyle()
        {
            BackgroundFade = .7f,
            EdgeColor = SystemColors.Window,
            BorderColor = SystemColors.WindowFrame,
            EdgeWidth = 6,
            LowerColor = SystemColors.Control,
            UpperColor = SystemColors.Window
        };
    }
}

Ответы [ 2 ]

1 голос
/ 30 июня 2010

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

Обратите внимание, как Font является классом, установка отдельных свойств Font в сетке не является проблемой.Font имеет TypeConverter (System.Drawing.FontConverter), который принимает строку и преобразует ее в Font.Вот почему вы можете редактировать значение Font напрямую, вместо того, чтобы расширять узел и редактировать отдельные свойства.Он также имеет UITypeEditor, System.Drawing.Design.FontEditor, который представляет диалоговое окно, когда вы нажимаете кнопку с точками.

Что вам, вероятно, нужно сделать для вашего свойства, если вы хотите использовать длявыбрать из предопределенных стилей.Хорошим примером UITypeEditor для структуры является System.Drawing.Design.ColorEditor, используйте Reflector, чтобы взглянуть на класс.Чтобы просто предоставить свойства, вам нужен TypeConverter, хорошим примером такого для типа структуры является System.Drawing.PointConverter.

1 голос
/ 30 июня 2010

Если у вас есть свойство непростого типа, в окне «Свойства» автоматически отобразится кнопка «Плюс» для расширения экземпляра.

Чтобы предоставить настраиваемый раскрывающийся список, вам нужно написать UITypeEditor .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...