C# WinForms TabStrip 控件:无加速器

C# WinForms TabStrip control: no accelerator

我在 WinForms 窗体上使用标签条控件。我尽可能多地使用键盘加速器。当我将 TabPage 的 Text 属性 设置为例如&Documents,选项卡上的文本字面意思是 &Documents,而不是带下划线的字母 D

关于TabStrip 和TabPage 的帮助不涉及该主题。 属性 ShowKeyboardCues 是只读的。 Google无奈

谁能告诉我如何显示加速器?

这些控件都不支持该功能。可以模拟它,但这是一项漫长而复杂的任务,我不建议这样做,因为它是非标准功能。因此,任何人都不可能期望它发生。另一方面,使用 Ctrl+Tab 更改选项卡是标准行为,因此已被自动支持。

如果您确实想这样做,您需要:

  • 子类化控件
  • 覆盖绘画,自己在标签上绘制文字
  • 预览 keydown 事件并使用它来确定是否按下了您想要的组合键
  • Select 根据您拦截的按键以编程方式正确的选项卡

正如我所说,我不推荐这样做,因为这不是该控件的正常行为,而且复杂性意味着它可能存在错误。但是可能...

How can I set up keyboard shortcuts for a Windows Forms TabControl? 提供了有关为其设置键盘快捷键的提示。但是在显示加速器方面,您必须自己绘制它们

将 tabControl 的 DrawMode 设置为 OwnerDrawFixed 然后做一些代码来绘制标签,例如(我不得不努力让它变得如此丑陋)

    private void tabControl1_DrawItem(object sender, DrawItemEventArgs e)
    {
        //Change appearance of tabcontrol
        Brush backBrush = Brushes.Red;
        Brush foreBrush = Brushes.Blue;
        e.Graphics.FillRectangle(backBrush, e.Bounds);

        Rectangle r = e.Bounds;
        r = new Rectangle(r.X, r.Y + 3, r.Width, r.Height - 3);
        e.Graphics.DrawString("my label", e.Font, foreBrush, r);
        var sz = e.Graphics.MeasureString("my ", e.Font);
        e.Graphics.DrawString("_", Font, foreBrush, r.X + sz.Width - 2, r.Y + 2);
    }

开个玩笑,设置一些丑陋的颜色确实可以帮助您查看绘图区域的边界等。我相信您会喜欢它的..