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);
}
开个玩笑,设置一些丑陋的颜色确实可以帮助您查看绘图区域的边界等。我相信您会喜欢它的..
我在 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);
}
开个玩笑,设置一些丑陋的颜色确实可以帮助您查看绘图区域的边界等。我相信您会喜欢它的..