Может Лейбл получить фокус? - PullRequest
5 голосов
/ 17 апреля 2011

У меня есть один вопрос на экзамене моего университета о C #. Может ли метка получить фокус? Как я вижу на сайте MSDN, все элементы управления могут получить фокус, но некоторые из них недоступны для выбора.Поэтому мне кажется, что правильный ответ - «Метка могла получить фокус, но не могла быть выбрана».Также у Label есть метод Focus ().Пожалуйста, помогите мне понять.Thanx.

Ответы [ 6 ]

8 голосов
/ 17 апреля 2011

Из документации :

Элемент управления можно выбрать и получить фокус ввода, если все следующие true: значение Selectable ControlStyles установлен на true, это содержится в другом элементе управления, и все оба его родительских элемента управления видны и включен.

Поскольку элемент управления Label недоступен для выбора, он не может получить фокус ввода, даже если он наследует метод Focus() от Control. Таким образом, ответ нет .

6 голосов
/ 17 апреля 2011

Да, на Label есть метод Focus(), и да, это абсолютно правильно, он работает; но ведите себя по-другому. позвольте мне попытаться объяснить

Метка может быть связана с каким-то одним элементом управления вводом, например, меткой для текстового поля имени пользователя, поэтому с меткой есть понятие Associated Control. AssociatedControlID в MSDN

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

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

2 голосов
/ 17 апреля 2011

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

Каждый элемент управления, который наследуется от Control, имеет метод focus, но это не значит, что он может быть сфокусирован.

2 голосов
/ 17 апреля 2011

Легко узнать, может ли элемент управления получить фокус. Просто прочитайте

.CanFocus

свойство, которое унаследовано от класса Control.

Элементы управления Windows Forms в следующем списке недоступны для выбора. Элементы управления, полученные из этих элементов управления, также нельзя выбрать. (см. документация MSDN )

  • Группа
  • GroupBox
  • PictureBox
  • ProgressBar
  • Разветвитель
  • Метка
  • LinkLabel (когда в элементе управления нет ссылки)

Также:

Метод Focus возвращает true, если управление успешно получено фокус. Элемент управления может иметь вход фокусировать, не отображая визуальный намеки на то, чтобы сосредоточиться. это поведение в первую очередь наблюдается невыбираемые элементы управления, перечисленные ниже, или любые элементы управления, полученные из них.

Элемент управления можно выбрать и получить фокус ввода, если все следующие true: значение Selectable ControlStyles установлено на true, это содержится в другом элементе управления, и все оба его родительских элемента управления видны и включен.

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

1 голос
/ 17 апреля 2011

Метка получает фокус, но увеличивает его до поля ввода, указанного в его атрибуте «for». Нравится:

<label for="firstname">First Name</label><input type="text" name="firstname" />

В этом случае, если вы щелкнете по метке, она переместит фокус на поле ввода «имя», связанное с ним.

0 голосов
/ 26 июня 2012

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

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

Причина, по которой я добавляю следующее в качестве ответа здесь, заключается в том, что это возможно (извините, ребята, которые сказали, что это не так), и я нашел этот пост, и многим он понравился, но мне было мало помощи, когда я смотрел. В любом случае, способ сделать это - переопределить Label и установить SetStyle - также OnPaint для рисования прямоугольника фокуса (я нарисовал вручную, так как DrawFocusRectangle, похоже, ничего не делал) - как показано ниже:

internal class SelectableLabel: Label
{
    public SelectableLabel():base()
    {
        SetStyle(ControlStyles.Selectable, true);            
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        //ControlPaint.DrawFocusRectangle(e.Graphics, ClientRectangle);
        if (!Focused) return;
        if (BorderStyle == BorderStyle.Fixed3D)
        {
            e.Graphics.DrawLines(Pens.CadetBlue, new[] { new Point(1, Height - 1), new Point(1, 1), new Point(Width - 1, 1) });
            e.Graphics.DrawLines(Pens.Aquamarine, new[] { new Point(2, Height - 1), new Point(Width - 1, Height - 1), new Point(Width - 1, 2) });
        }
        else
        {
            e.Graphics.DrawRectangle(Pens.Aquamarine, 0, 0, Width - 1 , Height - 1 );
        }
    }        
}

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

...