Переосмысление элемента управления "метка"

Я должен переосмыслить/воссоздать Элемент управления "метка" с нуля для добавления моего собственного mojoness к нему. Да, я знаю то, что Вы думаете (и если Вы не думаете, что, разве не должны быть?).

Кто-то может указать на меня в правильном направлении?

Спасибо.

Целая цель для воссоздания маркировки состоит в том, что я хочу полный контроль над тем, как это оттянуто на экран, и так, чтобы у меня могли быть Обработчики событий KeyDown для него, также. Например, пользователь может отредактировать содержание маркировки тем же путем, они отредактировали бы контент управления TextBox.

Кроме того, я не могу просто использовать управление TextBox, поскольку оно потребовало бы почти, если не больше работа получать мой желаемый результат.

5
задан 28 April 2010 в 12:41
поделиться

5 ответов

Создать собственный элемент управления меткой достаточно просто, вам просто нужно начать с Control и переопределить OnPaint ().То, что будет байтовым, - это превратить его в элемент управления, который также имеет поведение фокусировки. И позволяет пользователю редактировать текст. К тому времени, как вы закончите, вы заново изобрели элемент управления TextBox. Что намного сложнее, чем кажется.

Сосредоточьтесь в первую очередь на фокусировке, это самая сложная проблема. Маловероятно, что пользователь захочет часто фокусировать элемент управления. Может какое-то секретное рукопожатие, вроде двойного щелчка. Когда вы его обнаружите, вы можете создать элемент управления TextBox и поместить его перед меткой. И удалите его, когда он потеряет фокус, обновив свойство Text метки. Или простое контекстное меню, в котором отображается небольшой диалог редактирования.

Пример, в котором для редактирования используется метод двойного щелчка:

using System;
using System.Windows.Forms;

class MyLabel : Label {
  private TextBox mEditor;
  protected override void OnDoubleClick(EventArgs e) {
    if (mEditor == null) {
      mEditor = new TextBox();
      mEditor.Location = this.Location;
      mEditor.Width = this.Width;
      mEditor.Font = this.Font;
      mEditor.Text = this.Text;
      mEditor.SelectionLength = this.Text.Length;
      mEditor.Leave += new EventHandler(mEditor_Leave);
      this.Parent.Controls.Add(mEditor);
      this.Parent.Controls.SetChildIndex(mEditor, 0);
      mEditor.Focus();
    }
    base.OnDoubleClick(e);
  }
  void mEditor_Leave(object sender, EventArgs e) {
    this.Text = mEditor.Text;
    mEditor.Dispose();
    mEditor = null;
  }
  protected override void Dispose(bool disposing) {
    if (disposing && mEditor != null) mEditor.Dispose();
    base.Dispose(disposing);
  }
}
1
ответ дан 18 December 2019 в 14:43
поделиться

Создайте класс, унаследованный от Control. Используйте вызов SetStyle (), чтобы включить рисование пользователем и двойную буферизацию, а также переопределить OnPaint () и любые другие методы, которые вам нужны.

class MyLabel : System.Windows.Forms.Control
{
    public MyLabel()
    {
        this.SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
    }

    protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
    {
        base.OnPaint(e);
        ControlPaint.DrawBorder3D(  e.Graphics, this.ClientRectangle, Border3DStyle.Etched, Border3DSide.All);
        e.Graphics.DrawString(this.Text, this.Font, Brushes.Red, 0, 0);
    }
}
2
ответ дан 18 December 2019 в 14:43
поделиться
public class MyLabel : System.Windows.Forms.Label
{
    protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
    {
        base.OnPaint(e);
        // or leave base out

        // you would determine these values by the length of the text
        e.Graphics.DrawEllipse(new System.Drawing.Pen(System.Drawing.Color.Red), 
                               0, 0, 50, 12);

    }

    protected override void OnKeyDown(System.Windows.Forms.KeyEventArgs e)
    {
        base.OnKeyDown(e);

        // although a label has a KeyDown event I don't know how it would 
        // receive focus, maybe you should create a text box that looks
        // like a label
    }
}

Как насчет этого?

2
ответ дан 18 December 2019 в 14:43
поделиться

Почему бы просто не расширить текущий?

class MyMojoLabel: Label // Что-то вроде

5
ответ дан 18 December 2019 в 14:43
поделиться

Хорошей отправной точкой может быть понимание того, как Microsoft реализовала этикетку.

Чтобы получить более подробное представление, вам следует взглянуть с помощью Reflector в класс или отладить исходный код элемента управления Label.

3
ответ дан 18 December 2019 в 14:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: