Использование сочетаний клавиш с элементами управления LinkLabel - PullRequest
7 голосов
/ 25 марта 2009

Я заметил, что сочетания клавиш, назначенные элементам управления linklabel в стандартных формах .NET WinForms, не работают.

Я создал экземпляр элемента управления LinkLabel и назначил свойству Text значение «Выбрать и все». Для большинства элементов управления (метка, кнопка, переключатель и т. Д.) Это может привести к тому, что Alt + A станет назначенным сочетанием клавиш для запуска события по умолчанию (нажатие). Это не происходит с LinkLabel (хотя он работает нормально для других элементов управления)

  • Я убедился, что сочетание клавиш не является дубликатом.
  • Я проверил, является ли ярлык установкой фокуса, а не срабатыванием Clicked. Фокус остается неизменным.
  • Я убедился, что для свойства UseMnemonic установлено значение true.

Есть идеи?


Решение

Спасибо, Чарли, за правильный ответ. Именно то, что мне было нужно. Я сделал небольшое изменение, так как этот фрагмент кода не будет компилироваться как есть. LinkLabelLinkClickedEventArgs требует LinkLabel.Link в качестве параметра конструкции, скорее спасибо LinkLabel.

class LinkLabelEx : LinkLabel
{
    protected override bool ProcessMnemonic(char charCode)
    {
        if (base.ProcessMnemonic(charCode))
        {
            if (this.Links.Count == 0)
                return false;
            OnLinkClicked(new LinkLabelLinkClickedEventArgs(this.Links[0]));
            return true;
        }
        return false;
    }
}

1 Ответ

9 голосов
/ 25 марта 2009

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

class BetterLinkLabel : LinkLabel
{
  protected override bool ProcessMnemonic( char charCode )
  {
    if( base.ProcessMnemonic( charCode ) )
    {
      // TODO: pass a valid LinkLabel.Link to the event arg ctor
      OnLinkClicked( new LinkLabelLinkClickedEventArgs( null ) );
      return true;
    }
    return false;
  }
}
...