【问题标题】:Windows.Forms Mnemonics don't workWindows.Forms 助记符不起作用
【发布时间】:2017-10-30 09:41:54
【问题描述】:

我和this guy有或多或少相同的问题,但他的帖子已经有2年了,所以我想我可以开一个新的。

在程序中我使用标签,我发现mnemonics on labels trigger the enter event of the next control in the tab order。所以实现了clickenter 方法。但问题就在这里。我创建了一个测试程序。该程序持久化了两个标签,一个按钮和一个文本框。

第二个标签只是用来控制enter 事件是否被触发。当我点击ALT 时,下划线看起来很好,但是当我按下第二个键(Reset)时没有任何反应。此外,如果出现下划线并且我再次按下ALT 键,他不会消失并且button 完全忽略ALT 是否被按下。 我用 VisualStudio 2013 搬到了另一台电脑,但得到了相同的结果。我下载了 VisualStudio 2017,尝试创建新程序 => 也不起作用。

英语不是我最熟悉的语言,所以如果你能在我写错时给我提示,我很高兴。 我希望有人可以帮助我。

Form1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void reset_Click(object sender, EventArgs e)
        {
            textBox.Text = "";
        }

        private void button_Click(object sender, EventArgs e)
        {
            textBox.Text = "Button";
        }

        private void nothing_Enter(object sender, EventArgs e)
        {
            textBox.Text = "nothing";
        }
    }
}

Form1.Designer.cs

        this.reset.Click += new System.EventHandler(this.reset_Click);
        this.button.Click += new System.EventHandler(this.button_Click);
        this.nothing.Enter += new System.EventHandler(this.nothing_Enter);

【问题讨论】:

  • 文字太多了。请尽量缩短您的帖子,仅提供核心信息以了解和重建您的问题。
  • 好的,我会这样做的。
  • 现在好点了吗?
  • 是的,现在好多了。
  • 标签被设计为充当“伙伴”控制的助记符。由 Label.ProcessMnemonic() 实现。 Primary 有助于为 TextBox 提供焦点。这个标签没有好友。考虑覆盖 ProcessCmdKey() 以识别击键。

标签: c# .net winforms visual-studio mnemonics


【解决方案1】:

当您在标签上使用助记符时 - 焦点转到表单上具有较高选项卡索引的下一个可选对象(它不会像选项卡那样环绕到下一个可选控件)。由于默认情况下标签不可选择 - 那么在重置标签后您没有可选择的控制 - 所以似乎没有发生任何事情。

如果您添加另一个具有更高选项卡索引的可选控件 - 例如一个选项卡索引值设置为 4 的文本框 - 那么您会发现按 Alt-r 将按预期转到该控件。

如果您想让标签可选择,那么您可以创建一个派生类,如此处的答案所示:Make label participate in control tabbing - 如果您将“无”标签设为 SelectableLabel - 然后按 Alt-r 将导致焦点移动到那个标签。

【讨论】:

  • 感谢您的回答。我按照你和帖子描述的做了。它起作用了,但只是一次。看来你只能按 ALT+R 一次。之后我需要用鼠标单击按钮才能再次使用 ALT+R。
  • 助记符仅适用于设置它的控件-因此 Alt-r 只会将您从“重置”标签移动到“无”标签(假设您将其设为 SelectableLabel)-之后按 alt-r,多次按 alt-r 似乎没有任何效果,因为您一直在移动到您已经在的“无”标签。如果您选择按钮或 shift-tab 返回“重置”标签(或通过单击选择一个控件)并按 Alt-r,那么您将再次移动到“无”标签。
  • 所以即使我在按 ALT+R 后按 ALT+B 焦点仍停留在空标签上?
  • 对于不同类型的控件,助记符的工作方式略有不同 - 请参阅上面 Hans Passant 的评论,标签助记符旨在与紧随其后的另一个可选控件配对,因此如果您在文本框旁边有标签(按标签索引顺序)助记符会将您移至该控件。使用按钮,助记符的效果是引发 Click 事件 - 但焦点不会从当前位置移动。尝试将光标放在一些文本中间的文本框中并按 Alt-B - 按钮单击事件将触发,但光标不会移动。
  • 好的,我可以用 button.Focus();在 textbox.Text = "nothing";我现在明白标签不是为这样的东西制作的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多