C # Создание пользовательских элементов управления - PullRequest
1 голос
/ 22 февраля 2011

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

Мой первый способ - просто создать стандартную кнопку выхода.Тем не менее, это не работает, как я думаю.По сути, я хочу, чтобы текст по умолчанию был «Выход из приложения», когда он добавляется в форму.К сожалению, два способа, о которых я подумал, на самом деле не показывают, что вместо этого он показывает имя класса кнопки, то есть «CustomExitButton1».Вот два способа, которые я попробовал:

public class StandardExitButton : Button
{

    public StandardExitButton()
    {
        this.ControlAdded += new ControlEventHandler(StandardExitButton_ControlAdded);
    }

    void StandardExitButton_ControlAdded(object sender, ControlEventArgs e)
    {
        Text = "Exit Application";
    }
}

И:

public class StandardExitButton : Button
{

    public StandardExitButton()
    {
        this.Text = "Exit Application";
    }


}

Ответы [ 8 ]

1 голос
/ 22 февраля 2011

Я сделал это с помощью нескольких кнопок, таких как «Добавить», «Редактировать», «Удалить», «Отмена», «ОК», «Выход» и т. Д. ... В дополнение к тому, что все мои кнопки, метки, текстовые поля и т. Д. Были сохранены моим собственным стандартным шрифтомразмеры, цвета и т. д. Для текста на каждой подклассной кнопке я сделал что-то вроде ...

[ReadOnly(true)]
public override string Text
{ get { return "&Exit Application"; } }

Никогда не нужно беспокоиться о «установщике», поскольку текст кнопки никогда не должен изменяться вконструктор или производное ...

EDIT - более полный образец ...

public class MyButton : Button
{
    [ReadOnly(true)]
    public sealed override Font Font
    { get { return new Font("Arial", 9F, FontStyle.Italic, GraphicsUnit.Point); } }

    [ReadOnly(true)]
    public sealed override Color ForeColor
    { get { return Color.Blue; } }

    public GDITButton()
    { }
}


public class MyExitButton : MyButton
{
    [ReadOnly(true)]
    public override string Text
    { get { return "Exit"; } }

    public MyExitButton()
    {}
}

public class MyAddButton : MyButton
{
    [ReadOnly(true)]
    public override string Text
    { get { return "Add"; } }

    public MyAddButton()
    {}
}

Затем, когда вы помещаете экземпляр MyExitButton или MyAddButton в форму, он будет FORCEподпись для вас, а также помешает вам изменить ее, так как это свойство только для чтения соответствующего класса.

1 голос
/ 22 февраля 2011

Вы должны сделать 2 вещи:

Изменить свойство текста на частное (чтобы не задавать его):

private new string Text  
{  
    get  
    {  
        return base.Text;  
    }  
    set  
    {  
        base.Text = value;  
    }  
}  

Установить текст по умолчанию:

public StandardExitButton()  
{  
    this.Text = "Exit Application";  
}  
1 голос
/ 22 февраля 2011

ControlAdded будет срабатывать при добавлении элемента управления в ваш элемент управления - не при добавлении элемента управления в другой элемент управления.(Вместо этого вы можете попробовать событие ParentChanged.)

1 голос
/ 22 февраля 2011
public StandardExitButton()
{
    this.Text = "Exit Application";
}

обработчик событий ControlAdded работает не так, как вы думаете, обратитесь к этому примеру

это работает?

0 голосов
/ 22 февраля 2011

Вы не можете увидеть это с помощью визуального дизайнера студии, вместо этого вам нужно загрузить его с кодом и запустить приложение, чтобы увидеть текст, как вы указали.

0 голосов
/ 22 февраля 2011

Как насчет чего-то вроде

[DefaultValue("Exit Application")]
public override string Text
{
    get
    {
        return base.Text;
    }
    set
    {
        base.Text = value;
    }
}
0 голосов
/ 22 февраля 2011

Ааа - проблема здесь в том, что конструктор системы делает следующее:

  • Создает экземпляр вашего контроля (выполнение кода в конструктор), так что ваш текст «Выход Приложение "на очень короткое время.
  • Далее, независимо от того, какой текст вы установили Свойство, дизайнер тогда явно устанавливает текст для имени контроля.

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

0 голосов
/ 22 февраля 2011

Возможно, вам нужно переопределить кнопки public override string Text { get; set; } Свойство

...