C# 两行制表符文本

C# 两行制表符文本,c#,winforms,text,tabs,multiline,C#,Winforms,Text,Tabs,Multiline,我已经在VisualBasic中看到了这一点(尽管我还没有看到代码,也没有看到它是如何在设计视图中完成的,如果可能的话)。有没有办法在WinForms中创建两行选项卡名称?请看附件中的图片,我已经圈出了重点。当然,一定有办法做到这一点。事实上,所附图片是在VB6中完成的,不幸的是,我无法访问该代码 注:如果这是一个坏主意或不是一个好的做法,请让我知道。此外,如果解决方案太复杂,不值得探索,我愿意放弃它,但如果它足够简单,这将对我有很大帮助 我的屏幕上的prime real estate快用完了,

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

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

我的屏幕上的prime real estate快用完了,因为我们的一些表单上有12个选项卡(这是没有帮助的),并且我们的屏幕最大限制为1280 x 720。非常感谢您的帮助

不幸的是,我不允许发布图片,也就是说,这是我的第一篇帖子。如果有帮助的话,我会把它们贴到其他可能的地方

也许这个编辑暂时会有所帮助(很抱歉,这是一个糟糕的说明,鉴于(发布)编辑器的限制,这是我能做的最好的):


|Tab | Tab | Tab |
第1号|第2号|第3号|


上述选项卡标签(文本)应在选项卡名称上有两行,例如选项卡1第1行、选项卡2第2行等,其中选项卡1位于第一行,选项卡1位于第二行……等等


这是图像链接:

完整的解决方案分布在
选项卡控件
及其
选项卡页面

要强制执行
换行符
,请在
选项卡页
文本
中插入
\n

tabPage1.Text = "Line one\nLine two";
请注意,您需要code来设置
文本。在
设计器中设置它将不起作用!(它采用
反斜杠
,而不是转义序列,因为它只提供单行字段,所以您也不能使用
Shift-Enter
。)

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

tabPage1.Text = tabPage1.Text.Replace("\\n", "\n");
或者,更好,在一个循环中:

foreach (TabPage tp in tabControl1.TabPages) tp.Text = tp.Text.Replace("\\n", "\n");
为了腾出足够的空间,您可以将
选项卡的
ItemSize.Height
放大到40到48像素,当然这也取决于
字体
!:

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

请注意,非活动的
选项卡页面
文本
下降部分往往在
底部被切断,除非您将高度设置得非常大。如果这是一个问题,我想您必须“所有者绘制”
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();
}
这是一个真正的节省空间;高度降低到34像素,因此:

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

但是请注意,由于系统不知道您将在DrawItem代码中执行什么操作,因此它将为整个未拆分的文本保留足够的空间,从而导致选项卡过宽。如果愿意,您可以通过将真实的
文本
存储在每页的
标记
中,并使
文本
只在最长行需要时才显示来解决此问题:

if (tp.Tag == null)
{
   tp.Tag = tp.Text;
   tp.Text = "_____________";  // make large enough!!
}
string s = tp.Tag.ToString();
并在
DrawString
调用中使用
string s

如果您想使其更完美,可以编写一个函数来测量每个
选项卡文本及其换行位置,以确定所需的宽度


完整的解决方案分布在
选项卡控件
及其
选项卡页面

要强制执行
换行符
,请在
选项卡页
文本
中插入
\n

tabPage1.Text = "Line one\nLine two";
请注意,您需要code来设置
文本。在
设计器中设置它将不起作用!(它采用
反斜杠
,而不是转义序列,因为它只提供单行字段,所以您也不能使用
Shift-Enter
。)

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

tabPage1.Text = tabPage1.Text.Replace("\\n", "\n");
或者,更好,在一个循环中:

foreach (TabPage tp in tabControl1.TabPages) tp.Text = tp.Text.Replace("\\n", "\n");
为了腾出足够的空间,您可以将
选项卡的
ItemSize.Height
放大到40到48像素,当然这也取决于
字体
!:

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

请注意,非活动的
选项卡页面
文本
下降部分往往在
底部被切断,除非您将高度设置得非常大。如果这是一个问题,我想您必须“所有者绘制”
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();
}
这是一个真正的节省空间;高度降低到34像素,因此:

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

但是请注意,由于系统不知道您将在DrawItem代码中执行什么操作,因此它将为整个未拆分的文本保留足够的空间,从而导致选项卡过宽。如果愿意,您可以通过将真实的
文本
存储在每页的
标记
中,并使
文本
只在最长行需要时才显示来解决此问题:

if (tp.Tag == null)
{
   tp.Tag = tp.Text;
   tp.Text = "_____________";  // make large enough!!
}
string s = tp.Tag.ToString();
并在
DrawString
调用中使用
string s

如果您想使其更完美,可以编写一个函数来测量每个
选项卡文本及其换行位置,以确定所需的宽度


那么,附加的图像在哪里。。?只是好奇。@MethodMan,用户没有嵌入图像的代表,但可以包含链接,以便有人可以在适当的情况下将其编辑到问题中。您可能对属性感兴趣。我同意@Alex这也将有助于@Grant Winney,yo