如何让 TabControl 使用其父级的完整宽度?

问题描述 投票:0回答:9

标准 System.Windows.Forms.TabControl 组件在它包含的 TabPage 周围绘制边框。如果将其 Dock 设置为 Fill,这些边框会延伸到父控件的边缘,但它们仍然存在,占用屏幕空间。

在 Visual Studio 中,如果将两个窗口停靠在同一位置,则会在底部获得一组类似 TabControl 的选项卡,但两侧没有边框。

是否有可能让 TabControl 以这种方式显示其 TabPages,而不会浪费两侧的屏幕空间?如果可能的话,我想避免涉及自己绘制控件的解决方案。

c# .net winforms tabcontrol
9个回答
7
投票
  1. 从 TabControl 中删除高度和宽度属性
  2. 设置水平和垂直对齐方式拉伸

例如不会拉伸;

<TabControl Height="373" Width="609" HorizontalAlignment="Stretch" Name="tabControl1" VerticalAlignment="Stretch"  VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch">

例如会伸展;

<TabControl HorizontalAlignment="Stretch" Name="tabControl1" VerticalAlignment="Stretch"  VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch">

5
投票

您应该尝试使用 Anchor 来锚定四个边,而不是使用 Dock 属性。然后,您需要定位 TabControl,使其在所有边上都比父控件大几个像素。这样边框就会被隐藏,因为它们在父控件后面时无法绘制。


1
投票

使用标准 .NET 选项卡控件,这是不可能直接实现的。这样做的最终目标是什么?您是否正在尝试模拟与 Visual Studio 相同类型的选项卡式 MDI 样式显示?如果是这种情况,有几种可用的第三方解决方案 - 一些是开源的,一些是商业的。

有关使用 Anchor 属性与设置大小相结合的其他响应,使其比实际窗口大一点可能会起作用,但我认为它在视觉上看起来可能有点奇怪。无论主题和辅助功能设置如何,它都应该有效,但您最终可能必须以编程方式将大小设置为比父级大几个像素。


1
投票

是否有可能让 TabControl 以这种方式显示其 TabPages,而不会浪费两侧的屏幕空间?如果可能的话,我想避免涉及自己绘制控件的解决方案。

如果我正确理解你的问题,并阅读当前接受的答案,你想知道如何使 TabControl 的选项卡横跨整个控件不浪费空间,如下所示:

为此,请设置 cTabControl.Dock = Fill,然后创建以下函数并在 Form1_Shown()Form1_Resize() 或您创建的任何“Resize()”函数中调用它。

C#

void ResizeTabs()
{
    int numTabs = cTabControl.TabCount;

    float totLen = 0;
    using(Graphics g = CreateGraphics())
    {
        // Get total length of the text of each Tab name
        for(int i = 0; i < numTabs; i++)
            totLen += g.MeasureString(cTabControl.TabPages[i].Text, cTabControl.Font).Width;
    }

    int newX = (int)((cTabControl.Width - totLen) / numTabs) / 2;
    cTabControl.Padding = new Point(newX, cTabControl.Padding.Y);
}

VB

Sub ResizeTabs()
    Dim numTabs As Integer = cTabControl.TabCount

    Dim totLen As Decimal = 0
    Using g As Graphics = CreateGraphics()
        ' Get total length of the text of each Tab name
        For i As Integer = 0 To numTabs - 1
            totLen += g.MeasureString(cTabControl.TabPages(i).Text, cTabControl.Font).Width
        Next
    End Using

    Dim newX As Integer = ((cTabControl.Width - totLen) / numTabs) / 2
    cTabControl.Padding = New Point(newX, cTabControl.Padding.Y)
End Sub

0
投票

我通过在选项卡标题中添加空格解决了同样的问题:

var 页面对齐 = 50;

TabPage1.Text = TabPage1.Text.PadLeft(pageAlignment / 2).PadRight(pageAlignment); TabPage2.Text = TabPage2.Text.PadLeft(pageAlignment / 2).PadRight(pageAlignment); TabPage3.Text = TabPage3.Text.PadLeft(pageAlignment / 2).PadRight(pageAlignment);


0
投票

对于那些使用 VS2022 的人来说,这样的解决方案将会很有帮助:

tabControl1.SizeMode = TabSizeMode.Fixed;
tabControl1.ItemSize = new Size((int)(tabControl1.Width * 0.95) / tabControl1.TabCount, 0);

-1
投票

锚定控件的左侧和右侧,宽度设置为父控件的宽度。

childControl.Anchor = Anchor.Left|Anchor.Right; childControl.Width = ParentControl.Width;


-1
投票
<Grid>
   <TabControl Name="tabControl1" >
       <TabItem Header="tabItem1" Name="tabItem1">
          <Grid />
       </TabItem>
       <TabItem Header="tabItem2" Name="tabItem2">
          <Grid />
       </TabItem>
       <TabItem Header="tabItem3" Name="tabItem3">
          <Grid />
       </TabItem>
  </TabControl>
</Grid>

-2
投票

请勿停靠 TabControl。将其拉伸到设计器上,使其左右边缘延伸到窗口之外。

© www.soinside.com 2019 - 2024. All rights reserved.