Использование сочетаний клавиш с элементами управления LinkLabel

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

Я создал экземпляр элемента управления LinkLabel и присвоил свойству Text значение «Выбрать и все». Для большинства элементов управления (ярлык, кнопка, переключатель и т. д.) это приведет к тому, что Alt+A станет назначенным сочетанием клавиш для запуска события по умолчанию (Clicked). Этого не происходит для 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;
    }
}

person Simon Gillbee    schedule 25.03.2009    source источник
comment
Нажатие ускорителя LinkLabel фокусирует следующий элемент управления в порядке табуляции... он действительно действует как метка, которая, вероятно, часто бывает неожиданной и нежелательной.   -  person EricLaw    schedule 25.10.2012


Ответы (1)


Я считаю, что это просто недостаток 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;
  }
}
person Charlie    schedule 25.03.2009
comment
Спасибо, Чарли, за правильный ответ. Именно то, что мне было нужно. Я сделал небольшую модификацию, так как этот фрагмент кода не будет компилироваться как есть. LinkLabelLinkClickedEventArgs требует LinkLabel.Link в качестве параметра построения, а не LinkLabel. - person Simon Gillbee; 25.03.2009
comment
Извините за это, я сделал последнюю настройку этой части, не тестируя ее. Хотя, похоже, тебе пора идти. - person Charlie; 25.03.2009