如何让TabControl使用其父级的全宽?

时间:2009-01-29 09:55:30

标签: c# .net winforms tabcontrol

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

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

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

7 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分: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>

答案 3 :(得分:0)

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

如果我正确理解了您的问题,并通读了currently accepted answer,您想知道如何使TabControl的Tabs延伸到整个控件上,而不会浪费空间,如下所示 :

为此,请设置 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

答案 4 :(得分: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);

答案 5 :(得分:-1)

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

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

答案 6 :(得分:-2)

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