8

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

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

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

4

8 回答 8

8
  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">
于 2012-09-19T00:25:36.470 回答
5

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

于 2009-02-03T01:31:02.067 回答
1

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

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

于 2009-08-10T03:10:28.013 回答
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
于 2020-01-21T21:58:05.450 回答
0
<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>
于 2012-04-17T08:19:00.850 回答
0

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

var pageAlignment = 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);

于 2021-06-16T15:19:00.997 回答
-1

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

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

于 2009-02-03T01:33:14.977 回答
-2

不要停靠 TabControl。在设计器上拉伸它,使其左右边缘延伸到窗口之外。

于 2009-02-07T02:20:30.603 回答