【问题标题】:Two line Tab Text两行制表符文本
【发布时间】:2023-03-30 22:07:01
【问题描述】:

我已经在 Visual Basic 中看到了这一点(虽然我还没有看到代码,或者它是如何在设计视图中完成的,如果可能的话)。有没有办法在 WinForms 中创建一个 两行 标签名称 ?请看附图,我已经圈了它以示强调。当然,必须有办法做到这一点。事实上,附图是在 VB6 中完成的,不幸的是我无法访问代码。

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

我的屏幕上的 prime 空间已经用完了,因为我们的一些表单上有 12 个选项卡(没办法),而且我们的屏幕被限制为最大1280 x 720。非常感谢任何帮助。

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

也许这个编辑暂时会有所帮助,(抱歉插图不佳,鉴于(发布)编辑器的限制,这是我能做的最好的):


|标签 |标签 |标签 |
|No.1 | 2号| 3号|


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

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

【问题讨论】:

  • 那么附件图片在哪里..?只是好奇..
  • @MethodMan,用户没有嵌入图像的代表,但可以包含链接,以便有人可以在适当的情况下将其编辑到问题中。
  • 您可能对this 属性感兴趣。
  • 我同意@Alex,这也会有所帮助
  • @Grant Winney,你说得对,我应该说 WinForms。如前所述,我是新手,请原谅我不准确的术语。 @ MethodMan,Alex 是对的,但不幸的是,大多数允许我发布图片的网站都被我们的组织屏蔽了。仍在寻找,会尽快发布。

标签: c# winforms text tabs multiline


【解决方案1】:

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

要强制使用NewLine,您可以在TabPageText 中插入\n

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

请注意,您需要代码来设置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 处被切断,除非您将高度设置得非常大。如果这是一个问题,我想你将不得不“所有者绘制”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 代码中做什么,它会为整个未拆分的文本保留足够的空间,从而导致选项卡过于宽泛。如果需要,您可以通过将真实的 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 及其换行位置以找出必要的宽度..

【讨论】:

  • 非常感谢您的详细解决方案...这正是我正在寻找的...干杯...
  • \n、\r\n 或 Enviroment.NewLine 似乎不适用于 tabPage1 上的文本(在此示例中)。我在这里遗漏了一些明显的东西吗?我在想这个 tabPage1.Text 没有多行属性?
  • 不确定您是如何编写的或您使用的是哪个选项。但是有一件事:您需要以我现在在更新的答案中提到的两种方式之一来设置 Text in code .. 不,不,不是很明显,我只是从未注意到,对不起!
  • 这太棒了!再次感谢您分享此代码。我已经完成了所有工作,只是这部分是我想要弄清楚的:其中一个好处是,现在您也可以在选项卡中显示带有背景色的活动页面,也就是说,如果你的页面有不同的背景色 我对这个说法的理解是,你可以让 tabControl 的颜色与在设计器的 BackColor 属性上设置的标签的背景颜色相同?
  • 是的,我有时喜欢这样做。如果标签页有单独的背景色,则该颜色本身不会扩散到标签中,并且页面及其标签不会看起来像应有的那样。通过使用 SolidBursh 创建的表单 tp.Backcolor 而不是 SystemBrushes.Window,它看起来像一个整体。当然,只有在页面有单独的颜色时才有意义。在您的选项卡控件相当拥挤的情况下,我想我不会这样做..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-08
  • 2014-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多