两行制表符文本

Two line Tab Text

我已经在 Visual Basic 中看到了这一点(尽管我没有看到代码,也没有看到它是如何在设计视图中完成的,如果可能的话)。有没有办法在 WinForms 中创建一个 两行 选项卡名称 ?请看附图,我圈出来是为了强调。当然,必须有办法做到这一点。事实上,所附图片是在 VB6 中完成的,不幸的是我无法访问代码。

注意:如果这是个坏主意或不好的做法,请告诉我。此外,如果解决方案太复杂且不值得探索,我愿意放弃它,但如果它足够简单,那将对我有很大帮助。

我 运行 屏幕上的 prime 空间不足,因为我们的某些表单上有 12 个选项卡(没办法) ,并且我们的屏幕最大限制为 1280 x 720。非常感谢任何帮助。

很遗憾,我不能post一张照片,也就是说,这是我的第一张post。如果有帮助,我会 post 将它们放在其他可能的地方。

也许这个编辑暂时有用,(抱歉插图不佳,考虑到(posting)编辑器的限制,这是我能做的最好的):


|选项卡 |选项卡 |选项卡 |
|No.1 | No.2| 3号|


上面的 选项卡标签(文本) 选项卡名称应该有两行,例如Tab 1 No. 1, Tab 2 No. 2, 等等 其中 Tab 1 在第一行,否。 1在第二行...等等

这是图片 link:http://imgur.com/gallery/LZSy5r5/new

完整的解决方案分布在 TabControl 及其 TabPages

要强制执行 NewLine,请在 TabPageText 中插入 \n

tabPage1.Text = "Line one\nLine two";

请注意,您需要 code 来设置 Text。在 Designer 中设置是行不通的! (它采用 Backslash 字面意思而不是转义序列,因为它只提供单行字段,所以你也不能使用 Shift-Enter..)

您仍然可以使用设计器,但必须在代码中强制执行 newline,可能像这样:

tabPage1.Text = tabPage1.Text.Replace("\n", "\n");

或者,更好的是,在一个循环中:

foreach (TabPage tp in tabControl1.TabPages) tp.Text = tp.Text.Replace("\n", "\n");

为了腾出足够的空间,您将 TabItemSize.Height 放大到 40 到 48 像素,当然也取决于 Font!:

tabControl1.ItemSize = new Size(tabControl1.ItemSize.Width,  42);

结果:

请注意,非活动 TabPageTexts' 下行部分往往会在 Bottom 处被截断,除非您将高度设置得非常大。如果那是个问题,我想你将不得不 'owner-draw' TabControl。听起来比实际更难......:

将 Tabcontrol 设置为所有者绘制:

tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;

并将这段代码添加到 DrawItem 事件中:

private void tabControl1_DrawItem(object sender, DrawItemEventArgs e)
{
    if ( e.Index == tabControl1.SelectedIndex)
        e.Graphics.FillRectangle(SystemBrushes.Window, e.Bounds);
    else
        e.Graphics.FillRectangle(SystemBrushes.Control, e.Bounds);

    TabPage tp = tabControl1.TabPages[e.Index];

    Point pt = new Point(e.Bounds.X + 2, e.Bounds.Y + 4);
    e.Graphics.DrawString(tp.Text, tabControl1.Font, SystemBrushes.ControlText, pt);
    e.DrawFocusRectangle();
}

这是一个真正的 space 节省;高度下降到 34 像素导致:

其中一个好处是现在您也可以在选项卡中显示活动页面及其背景颜色,也就是说,如果您的页面有不同的背景颜色..

但是请注意,由于系统不知道您将在 DrawItem 代码中执行什么操作,因此它会为整个未拆分的文本保留足够的空间,从而导致制表符过于宽泛。如果你愿意,你可以解决这个问题,方法是将真实的 Text 存储在每个页面的 Tag 中,并使 Text 仅在最长行所需的长度内设置:

if (tp.Tag == null)
{
   tp.Tag = tp.Text;
   tp.Text = "_____________";  // make large enough!!
}
string s = tp.Tag.ToString();

并在 DrawString 调用中使用 string s

如果你想让它完美你可以写一个函数来测量每个TabPage Text和它的换行位置来找出必要的宽度..