Почему дизайнер winforms игнорирует атрибуты переопределенных свойств? - PullRequest
1 голос
/ 29 октября 2009

У меня есть пользовательский элемент управления, определенный следующим образом:

  public partial class FooControl : UserControl
  {
      private System.Windows.Forms.GroupBox groupBox1;
      ...

Я хотел, чтобы groupBox1.Text был доступен напрямую от дизайнера, поэтому я выбрал очевидное решение и создал следующее свойство в моем FooControl:

        [CategoryAttribute("Appearance"), DescriptionAttribute("The text associated with this control.")]
        public string Text
        {
            get { return groupBox1.Text; }
            set { groupBox1.Text = value;}
        }

Это не работает, потому что Text уже определен в моем суперклассе (на самом деле, он немного в неведении из-за атрибута browseable = false, но я в конце концов его нашел):

  public class UserControl : ContainerControl
    {

        [Bindable(false)]
        [EditorBrowsable(EditorBrowsableState.Never)]
        [Browsable(false)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public override string Text { get; set; }

Простой обходной путь - использовать «Text2» вместо «Text» в качестве имени свойства, и в этом случае все работает нормально.

Однако, если я использую переопределение или новый, мой код компилируется (и работает), но мое свойство Text не отображается в конструкторе.

В чем причина такого поведения? Есть ли обходной путь (кроме использования другого имени свойства)?

1 Ответ

1 голос
/ 05 июня 2013

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

public partial class FooControl : UserControl
{
    string m_text;

    [CategoryAttribute("Appearance"), DescriptionAttribute("The text associated with this control.")]
    [Bindable(true)]
    [EditorBrowsable(EditorBrowsableState.Always)]
    [Browsable(true)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
    public override string Text
    {
        get { return m_text; }
        set
        {
            m_text = value;
            groupBox1.Text = m_text;
        }
    }

    public FooControl()
    {
        InitializeComponent();
    }
}

Обратите внимание, я не тестировал приведенный выше код в Visual Studio 2008, но он должен работать без проблем.

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