C # показ доступных для просмотра дочерних свойств в конструкторе - PullRequest
4 голосов
/ 13 ноября 2009

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

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

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

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

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

Ответы [ 4 ]

5 голосов
/ 13 ноября 2009

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

Например, у меня есть пользовательский элемент управления и класс кнопок. Я хочу раскрыть свойства 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.

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

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

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

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

2 голосов
/ 13 ноября 2009

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

1 голос
/ 13 ноября 2009

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

Лично я бы просто переэкспонировал интересующие меня свойства, возможно, поместив их в другой [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 голосов
/ 13 ноября 2009

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

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