2009-11-13 2 views
2

Я использую .NET C# со стандартными WinForms, а не с WPF.C# показать доступные свойства для просмотра в дизайнере

У меня такая ситуация. Я создаю пользовательский элемент управления для месячного календаря, аналогичный .NET, но с немного большей функциональностью. У меня есть пользовательская форма управления, которая заполняется объектами кнопок, представляющими даты. Кнопки могут быть окрашены в разные цвета в зависимости от их состояния (выбрано, мыши, выходные ...)

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

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

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

+0

Некоторые примеры кода, как выглядят ваши дочерние классы, могут помочь – thecoop

+0

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

+0

Добавленный пример; это миллион миль? –

ответ

1

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

Лично я бы просто перепрофилировал интересующие вас объекты, возможно, поставив их в разные [Category(...)] - убедившись, что у них есть сеттеры и геттеры.

Немного напоминает:

using System; 
using System.ComponentModel; 
using System.Drawing; 
using System.Windows.Forms; 

class MyControl : UserControl 
{ 
    private Button button; 
    private Label label; 
    public MyControl() 
    { 
     button = new Button { Dock = DockStyle.Right, Text = "Click me" }; 
     label = new Label { Dock = DockStyle.Left}; 
     Controls.Add(button); 
     Controls.Add(label); 
    } 
    [Category("Wonder Control")] 
    public string CaptionText { get { return label.Text; } set { label.Text = value; } } 
    [Category("Wonder Control")] 
    public Color ButtonBackColor { get { return button.BackColor; } set { button.BackColor = value; } } 
} 
static class Program 
{ 

    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 

     using (Form form = new Form()) 
     using (MyControl ctrl = new MyControl()) 
     using (PropertyGrid grid = new PropertyGrid()) 
     { 
      ctrl.ButtonBackColor = Color.Red; 
      ctrl.CaptionText = "Caption"; 
      ctrl.Dock = DockStyle.Fill; 
      grid.Dock = DockStyle.Right; 
      form.Controls.Add(ctrl); 
      form.Controls.Add(grid); 
      grid.SelectedObject = ctrl; 
      Application.Run(form); 
     } 

    } 
} 
+0

Как вы имеете в виду повторное выставление? Я могу показать их в родительском классе с помощью [Категория]. Есть ли способ показать их только в дочернем классе? –

2

Для свойства, чтобы быть видимым в конструкторе, они должны быть открытыми свойствами с геттер и сеттер - от того, что вы говорите, свойства являются единственными добытчиками. Также можно попробовать указать BrowsableAttribute и BindableAttribute на свойства, чтобы заставить дизайнера, чтобы показать их ...

3

Хорошо, я попробую объяснить код корыта:

К примеру, у меня есть элемент управления пользователя и . Я хочу показать свойства Button и сделать их видимыми среди свойств MyControl в дизайнере.

class MyControl : UserControl 
{ 
    private MyButton button; 
    button.ChangeStyle("Selected"); 
} 

class MyButton : Button 
{ 
    private Color buttonColor; 

    public void ChangeStyle(string styleName) 
    { 
      if (styleName == "Selected") 
       this.BackColor = buttonColor; 
    } 

    [Browsable(true)] 
    [Category("Button style")] 
    public Color ButtonColor 
    { 
      get { return buttonColor; } 
      set { buttonColor = value; } 
    } 
} 

Это простой пример. Обычно у меня есть 5 различных стилей, включая цвет фона и переднего плана для каждого из них. Поэтому вместо управления цветами в классе MyControl я хотел бы определить их в классе MyButton. Но проблема в том, что свойства в классе MyButton не видны в дизайнере, потому что они фокусируются только на свойствах MyControl.

КПП. игнорировать недостающие конструкторы и другие основные классы вещи в примере кода

Я не могу использовать:

[Category("Wonder Control")] 
public Color ButtonBackColor { get { return button.BackColor; } set { button.BackColor = value; } 

, потому что у меня есть 30 кнопок в MyControl (дней в месяце), и я не могу ссылаться только один объект.

0

Если все кнопки в элементе управления будут иметь один и тот же внешний вид, почему бы не поместить свойство на уровне управления и не включить ли какие-либо изменения во все кнопки? Кроме того, использование 30 отдельных кнопок управления кнопками выглядит как много накладных расходов ... рассмотрели ли вы рисование меток на дни и обработку событий щелчка мыши/зависания, чтобы определить, когда нажимается конкретный день?

+0

Это текущее решение. У меня есть свойства управления для цветов и их распространение на кнопки. Я рассмотрел вручную все, но хочу, чтобы кнопки были активными объектами, а не просто простой графикой. Я бы хотел, чтобы не ударил, проверяя весь пользовательский элемент управления, чтобы определить выбранную дату. Также таким образом мне не нужно перерисовывать все даты на каждом клике, только те, которые были изменены. –

+0

Что вы подразумеваете под «большим количеством накладных расходов»? Проблемы с производительностью или просто лишний код? Я думал о ручном создании класса кнопок, а не просто наследовании от Button и реализации только тех функций, которые мне нужны –