Почему ключи доступа не работают в этом случае - PullRequest
0 голосов
/ 24 апреля 2020

Я играл с клавишами доступа и MenuStrips в c#, и я столкнулся с проблемой, на которую я не смог найти ответ. Я знаю, что Visual Stud ios имеет быстрое и простое перетаскивание, чтобы добавить MenuStrip в форму, но я хотел узнать больше за кулисами так сказать. Это почти рабочий код.

using System;
using System.Drawing;
using System.Windows.Forms;

namespace MenuStripTest
{
     class MainClass
     {
          private static Form mainForm = new Form();
          private static Button testButton = new Button();
          private static MenuStrip menuStrip = new MenuStrip();
          private static ToolStripMenuItem fileMenu = new ToolStripMenuItem();
          private static ToolStripMenuItem fileNewButton = new ToolStripMenuItem();

          public static void Main()
          {
               // testButton
               testButton.Location = new Point(100, 100);
               testButton.Text = "&Test";
               testButton.Click += new EventHandler(button_Click);

               // menuStrip
               menuStrip.Dock = DockStyle.Top;
               menuStrip.Items.Add(fileMenu);

               // fileNewButton
               fileNewButton.Text = "&New";
               fileNewButton.Click += new EventHandler(button_Click);

               // fileMenu
               fileMenu.Text = "File";
               fileMenu.DropDownItems.Add(fileNewButton);

               // mainForm
               mainForm.Width = 500;
               mainForm.Height = 500;
               mainForm.KeyPreview = true;
               mainForm.MainMenuStrip = menuStrip;
               mainForm.Controls.Add(menuStrip);
               mainForm.Controls.Add(testButton);

               Application.Run(mainForm);
          }

          private static void button_Click(object sender, EventArgs e)
          {
               MessageBox.Show("Event Executed");
          }
     }
}

Этот код почти делает то, что я хотел. Я могу нажать ALT + t, и появится MessageBox. Однако, когда я нажимаю ALT + n, fileMenu ToolStripMenuItem получает фокус, но элемент управления fileNewButton никогда не щелкается, и в результате MessageBox не запускается. Я прочитал документы Microsoft по этому вопросу и не могу найти объяснения этому поведению, и inte rnet тоже не показывает много. Я могу предположить, что, возможно, DropDown не сфокусирован и не визуализирован, но я действительно понятия не имею. Может кто-нибудь объяснить, пожалуйста, это поведение и то, что мне не хватает, чтобы это функционировало так, как я хочу. Спасибо!

Если что-то изменится, этот код был скомпилирован с помощью cs c .exe

1 Ответ

0 голосов
/ 24 апреля 2020

Речь идет о путанице между & (клавишей быстрого доступа для пункта меню) и комбинацией клавиш, также известной как клавиатурные ускорители , которая обрабатывается по окнам и обеспечивает непосредственное выполнение команды меню .

Если быстрая клавиша не была указана явно (с & как вы уже сделали для "New"), инициалы автоматически становятся клавишей быстрого доступа с ALT.

Это потому, что когда доступ к элементу меню осуществляется нажатием последовательных клавиш (а не комбинации), метод ToolStripDropDown.ProcessDialogKey обрабатывает его, выбирает соответствующий элемент меню в раскрывающемся меню и запускает событие click.

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

Это причина поведения, которое вы переживают, и это по замыслу.

Вы можете убедиться в этом сами, просто взломав свой электронный обработчик сброса и путем изучения стека вызовов, когда он вызывается через ALT + F и + N, а затем на этот раз назначенным клавишным ускорителем, скажем прямо ALT + N.

Рассмотрим добавление следующих новых пунктов меню Ваша форма.

private static ToolStripMenuItem projectMenu = new ToolStripMenuItem();
private static ToolStripMenuItem projectPropertiesMenuItem = new ToolStripMenuItem();

И они заполняются следующим образом:

projectMenu.Text = "Project";
projectPropertiesMenuItem.Text = "Properties";
projectPropertiesMenuItem.Click += new EventHandler(button_Click);

menuStrip.Items.Add(projectMenu);
projectMenu.DropDownItems.Add(projectPropertiesMenuItem);

Вы можете видеть, что при запуске формы ALT + P активирует новое меню, даже если мы не указали ярлык для него. ToolStripMenuItem обрабатывает это автоматически.

Но мы можем назначить ускоритель клавиатуры для нашего пункта меню следующим образом:

projectPropertiesMenuItem.ShortcutKeys = Keys.Alt | Keys.P;

Который

  1. Удаляет обработку ярлыков ALT + P у владельца;
  2. Устанавливает глобальный ярлык для вложенного пункта меню;
  3. , а также показывает его рядом с текстом меню (бонус)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...