C#快捷键下划线未在构建的应用程序中显示

Nid*_*rax 4 .net c# keyboard-shortcuts visual-studio-2010 toolstripmenu

我的.Net 4.0 ToolStripMenuItem标题有一个小问题.
我希望它强调项目文本中的快捷方式(访问)关键字母.
我在项目文本字段中使用了&符号:'&New map',它在编辑器中看起来很好:
在此输入图像描述

但是,当我构建应用程序时,下划线消失:
在此输入图像描述

有谁知道它为什么会发生以及如何在构建的表单中制作强调显示?

Dav*_*nan 6

这是Windows的默认行为.除非您使用键盘调用菜单,否则将隐藏加速键.按ALT查看加速器.请注意,您可以在其他程序中看到此行为,例如尝试记事本.

如果要更改自己计算机上的行为,可以将系统配置为始终从轻松访问中心显示加速键.该设置位于" 使键盘更易于使用"下,在我的Windows 7机器上如下所示:

在此输入图像描述

请注意,强烈建议您让用户选择是否隐藏加速键.换句话说,您的应用程序已经正常运行,在我看来,您不应该更改其当前行为.


Bar*_*zKP 5

如其他答案中所述,这是默认行为。仅在ALT按键后才显示加速器。

但是,似乎有可能迫使Windows不断显示加速键:

[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern int SystemParametersInfo(int uAction, int uParam, int lpvParam, int fuWinIni);

private const int SPI_SETKEYBOARDCUES = 4107; //100B
private const int SPIF_SENDWININICHANGE = 2;

[STAThread]
static void Main()
{
    // always show accelerator underlines
    SystemParametersInfo(SPI_SETKEYBOARDCUES, 0, 1, 0);

    Application.Run(new MainForm());
}
Run Code Online (Sandbox Code Playgroud)

这里找到。

正如我刚刚验证的那样(在ken2k的建议之后),这不幸地影响了整个系统。因此,需要进行一些调整:1)记住SPI_SETKEYBOARDCUES启动时的当前值2)退出时将设置重置为该值,3)创建域异常处理程序,以确保始终将设置重置为默认值。

不幸的是,即使最后一个参数为零,即使文档说:

如果您不想更新用户配置文件或广播WM_SETTINGCHANGE消息,则此参数可以为零

简单版本当然就是:

[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern int SystemParametersInfo(int uAction, int uParam, int lpvParam, int fuWinIni);

private const int SPI_SETKEYBOARDCUES = 4107; //100B
private const int SPIF_SENDWININICHANGE = 2;

[STAThread]
static void Main()
{
    // always show accelerator underlines
    SystemParametersInfo(SPI_SETKEYBOARDCUES, 0, 1, 0);

    Application.Run(new MainForm());

    SystemParametersInfo(SPI_SETKEYBOARDCUES, 0, 0, 0);
}
Run Code Online (Sandbox Code Playgroud)

此答案中,您可以找到一个代码示例,该示例说明如何仅在您的应用程序中本地实现此功能。

  • 是的,您可以执行此操作,但这不是一个好主意。应该允许用户做出选择。该应用程序不适合他们。如果拒绝此选择,用户将非常不高兴。 (2认同)
  • @DavidHeffernan不是用户的选择,而是应用程序设计者的选择。我认为您可以使应用程序看起来像您想要的样子是可以的。如果您想让用户参与确定应用程序的外观,那么它就是另一个层次-实现主题等。 (2认同)