标准 System.Windows.Forms.TabControl 组件在它包含的 TabPage 周围绘制边框。如果将其 Dock 设置为 Fill,这些边框会延伸到父控件的边缘,但它们仍然存在,占用屏幕空间。
在 Visual Studio 中,如果将两个窗口停靠在同一位置,则会在底部获得一组类似 TabControl 的选项卡,但两侧没有边框。
是否有可能让 TabControl 以这种方式显示其 TabPages,而不会浪费两侧的屏幕空间?如果可能的话,我想避免涉及自己绘制控件的解决方案。
例如不会拉伸;
<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">
您应该尝试使用 Anchor 来锚定四个边,而不是使用 Dock 属性。然后,您需要定位 TabControl,使其在所有边上都比父控件大几个像素。这样边框就会被隐藏,因为它们在父控件后面时无法绘制。
使用标准 .NET 选项卡控件,这是不可能直接实现的。这样做的最终目标是什么?您是否正在尝试模拟与 Visual Studio 相同类型的选项卡式 MDI 样式显示?如果是这种情况,有几种可用的第三方解决方案 - 一些是开源的,一些是商业的。
有关使用 Anchor 属性与设置大小相结合的其他响应,使其比实际窗口大一点可能会起作用,但我认为它在视觉上看起来可能有点奇怪。无论主题和辅助功能设置如何,它都应该有效,但您最终可能必须以编程方式将大小设置为比父级大几个像素。
是否有可能让 TabControl 以这种方式显示其 TabPages,而不会浪费两侧的屏幕空间?如果可能的话,我想避免涉及自己绘制控件的解决方案。
如果我正确理解你的问题,并阅读当前接受的答案,你想知道如何使 TabControl 的选项卡横跨整个控件不浪费空间,如下所示:
为此,请设置 cTabControl.Dock = Fill,然后创建以下函数并在 Form1_Shown() 和 Form1_Resize() 或您创建的任何“Resize()”函数中调用它。
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);
}
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
我通过在选项卡标题中添加空格解决了同样的问题:
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);
对于那些使用 VS2022 的人来说,这样的解决方案将会很有帮助:
tabControl1.SizeMode = TabSizeMode.Fixed;
tabControl1.ItemSize = new Size((int)(tabControl1.Width * 0.95) / tabControl1.TabCount, 0);
锚定控件的左侧和右侧,宽度设置为父控件的宽度。
childControl.Anchor = Anchor.Left|Anchor.Right; childControl.Width = ParentControl.Width;
<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>
请勿停靠 TabControl。将其拉伸到设计器上,使其左右边缘延伸到窗口之外。