2010-06-30 5 views
1

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

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


Я пишу пользовательский элемент управления, который имеет много различных элементов визуального типа, такие как градиентные цвета, ширины, проценты и т.д. Я хочу это всем быть настраиваемым, но и быть в состоянии установить все сразу с разными Styles. Я могу сделать это во время выполнения, создав свойство struct 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 
     }; 
    } 
} 
+0

Можете ли вы опубликовать несколько примеров того, как вы хотите, чтобы ваш код работал с этими структурами? – Oded

+0

Для всех этих материалов с дизайном лучшая книга, которую я использовал, была http://www.sellsbrothers.com/writing/wfbook, руки вниз. Много инструкций о том, как это сделать, я не смог найти информацию нигде. С тех пор я слишком много работал над такими вещами, чтобы предложить лучший совет. И я помню, что это очень печально, даже с большим ресурсом. – overslacked

ответ

1

Структуры с трудностями имеют дело с PropertyGrid, потому что они являются типами значений. Присвоение поля или свойства структуры не влияет на все значение структуры.

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

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

1

Если у вас есть свойство непростого типа, окно Properties будет автоматически отображаться кнопка Plus для расширения экземпляра.

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

+0

Вышеприведенный код показывает «Стиль: Sai.Phone.Client.GradientPanel + PanelStyle», но он отключен и не имеет кнопки «Плюс». – dlras2

Смежные вопросы