两行选项卡文本

wzk*_*wzk 1 c# tabs text multiline winforms

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

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

我的屏幕上的主要空间已经用完了,因为我们的一些表单上有 12 个选项卡(这是没有帮助的),并且我们的屏幕最大尺寸限制为 1280 x 720。非常感谢您的帮助。

不幸的是我不被允许发布图片,即这是我的第一篇文章。如果这有帮助,我会将它们发布到其他可能的地方。

也许这个编辑暂时会有帮助,(抱歉插图很差,考虑到(发布)编辑器的限制,这是我能做的最好的事情):


| 选项卡| 选项卡| 选项卡|
|第一名 | No.2| No.3|


上述选项卡标签(文本)的选项卡名称应有两行,例如Tab 1 No. 1、Tab 2 No. 2等,其中Tab 1位于第一行,No. 1位于第二行。 ..ETC。

这是图片链接: https://i.stack.imgur.com/yRPQ2.jpg

TaW*_*TaW 6

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

要强制执行 a,请在's中NewLine插入 a 。\nTabPageText

tabPage1.Text = "Line one\nLine two";
Run Code Online (Sandbox Code Playgroud)

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

您仍然可以使用设计器,但必须强制执行newline代码,可能如下所示:

tabPage1.Text = tabPage1.Text.Replace("\\n", "\n");
Run Code Online (Sandbox Code Playgroud)

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

foreach (TabPage tp in tabControl1.TabPages) tp.Text = tp.Text.Replace("\\n", "\n");
Run Code Online (Sandbox Code Playgroud)

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

tabControl1.ItemSize = new Size(tabControl1.ItemSize.Width,  42);
Run Code Online (Sandbox Code Playgroud)

结果:

在此输入图像描述

请注意,除非您将高度设置得很大,否则inactiveTabPageTexts'下降部分往往会在 处被切断。Bottom如果这是一个问题,我想你必须“所有者绘制”。听起来TabControl比实际上更难......:

将 Tabcontrol 设置为所有者绘制:

tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;
Run Code Online (Sandbox Code Playgroud)

并将这段代码添加到 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();
}
Run Code Online (Sandbox Code Playgroud)

这确实节省了空间;高度降至 34 像素,结果如下:

在此输入图像描述

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

但请注意,由于系统不知道您将在 DrawItem 代码中执行什么操作,因此它将为整个未分割的文本保留足够的空间,从而导致选项卡过宽。如果您愿意,您可以通过将实际值存储TextTag每个页面中并Text仅根据最长行所需的长度来解决此问题:

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

string s并在通话中使用DrawString

如果你想让它变得完美,你可以编写一个函数来测量每个TabPage Text及其换行位置,以找出必要的宽度。

在此输入图像描述