Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
隐藏C#TabControl上的选项卡标题_C#_Winforms_Tabcontrol - Fatal编程技术网

隐藏C#TabControl上的选项卡标题

隐藏C#TabControl上的选项卡标题,c#,winforms,tabcontrol,C#,Winforms,Tabcontrol,我正在开发一个有几个页面的Windows窗体应用程序。我正在使用TabControl来实现这一点。我希望我的应用程序能够控制这一点,而不是使用标题在选项卡之间切换。例如,在用户填写文本框并单击“下一步”按钮后,下一个选项卡应该打开。如果您确实想这样做,您可以这样做 tcActionControls.Region = new Region(new RectangleF( tbPageToShow.Left, tbPageToShow.To

我正在开发一个有几个页面的Windows窗体应用程序。我正在使用TabControl来实现这一点。我希望我的应用程序能够控制这一点,而不是使用标题在选项卡之间切换。例如,在用户填写文本框并单击“下一步”按钮后,下一个选项卡应该打开。

如果您确实想这样做,您可以这样做

 tcActionControls.Region = new Region(new RectangleF(
             tbPageToShow.Left, 
               tbPageToShow.Top, 
                 tbPageToShow.Width, 
                    tbPageToShow.Height)
);
其中
tcActionControls
是您的
TabControl
tbPageToShow
是在这个精确时刻显示的
TabPage

应该对你有用


注意。

创建新的UserControl,将其命名为TabControlWithoutHeader,将继承的UserControl更改为TabControl并添加一些代码。结果代码应该如下所示:

public partial class TabControlWithoutHeader: TabControl
{
    public TabControlWithoutHeader()
    {
        InitializeComponent();
    }

    protected override void WndProc(ref Message m)
    {
    if (m.Msg == 0x1328 && !DesignMode)
        m.Result = (IntPtr)1;
    else
        base.WndProc(ref m);
    }
}
编译后,工具箱中将有TabControlWithoutHeader控件。把它放到窗体上,在designer中你们会看到标题,但在运行时它们会被隐藏。如果您也想在designer中隐藏它们,请删除
&&&!设计模式

希望有帮助


您可以用手工制作的面板代替tabcontrol,模拟您想要的:

class MultiPagePanel : Panel
{
  private int _currentPageIndex;
  public int CurrentPageIndex
  {
    get { return _currentPageIndex; }
    set
    {
      if (value >= 0 && value < Controls.Count)
      {
        Controls[value].BringToFront();
        _currentPageIndex = value;
      }
    }
  }

  public void AddPage(Control page)
  {
    Controls.Add(page);
    page.Dock = DockStyle.Fill;
  }
}

向项目中添加一个新类并粘贴如下所示的代码。编译。将新控件从工具箱顶部拖到窗体上。它在设计时显示选项卡,以便您可以在设计时轻松地在它们之间切换。它们在运行时隐藏,请在代码中使用SelectedTab或SelectedIndex属性切换页面

using System;
using System.Windows.Forms;

public class TablessControl : TabControl {
  protected override void WndProc(ref Message m) {
    // Hide tabs by trapping the TCM_ADJUSTRECT message
    if (m.Msg == 0x1328 && !DesignMode) m.Result = (IntPtr)1;
    else base.WndProc(ref m);
  }
}

我需要这个代码,但在VB.net中,所以我转换了它。如果有人需要VB.Net中的这段代码,它就是

Imports System
Imports System.Windows.Forms

Public Class TablessControl
           Inherits System.Windows.Forms.TabControl

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        ' Hide tabs by trapping the TCM_ADJUSTRECT message
        If (m.Msg = Convert.ToInt32("0x1328", 16) And Not DesignMode) Then
            m.Result = CType(1, IntPtr)
        Else
            MyBase.WndProc(m)
        End If
    End Sub

End Class

感谢@Hans Passant在C#

中给出的答案,以补充Hans Passant现有的答案,我找到了四种方法,当选项卡数量超过表控件的宽度时,向用户隐藏箭头。没有一个单一的解决方案一定适合每个人,但可能适合你(或至少是它们的组合)

解决方案1: 只需启用多行。这将防止箭头首先出现。但是,请记住,在设计器中可能会丢失所见即所得,因为垂直空间将垂直向下调整,而TablesControl中的控件甚至可能在底部被“截断”(同样,仅在开发人员模式下)

解决方案2: 解决上述WYSIWYG问题的更高级解决方案是在程序运行后只启用
多行
。只需将此构造函数添加到TablesControl类:

public TablessControl()
{
    bool designMode = (LicenseManager.UsageMode == LicenseUsageMode.Designtime);
    if (!designMode) Multiline = true;      
}
对于开发人员来说,它们仍然显示为一行选项卡

解决方案3: 减小表控件的字体大小。每个选项卡都应该相应地缩小。因为用户永远看不到选项卡,所以如果将字体大小设置为4pt也没什么关系

但是要小心,因为TablesControl的内容也可能会调整大小。如果发生这种情况,请重新编辑内部每个小部件的字体大小,此时,即使您决定再次更改主表控件的字体大小,它们也会保持该大小

这种方法还有一个优点,就是可以更紧密地向开发者展示真正的所见即所得垂直房地产(用户可以很满意,但由于标签的高度,可能会在设计师的底部稍微剪掉)

此解决方案可与解决方案1和2结合使用,以积累优势

tabControl1.Appearance = TabAppearance.FlatButtons;
tabControl1.ItemSize = new Size(0, 1);
tabControl1.SizeMode = TabSizeMode.Fixed;
解决方案4: 如果任何选项卡都有很长的文本,这个解决方案就不一定那么好了。谢谢汉斯的建议

首先将TablesControl的
SizeMode
设置为“Fixed”,然后将TablesControl的
ItemSize
属性减小为较小的数字,以减小每个选项卡的宽度。也可以随意调整
ItemSize
Height
属性,以帮助解决上述所见即所得问题,尽管解决方案3可能对该问题更有帮助


此解决方案可以与上述解决方案结合使用,以进一步积累优势。

您可以尝试从TabPageCollection中删除TabPage:

tabControl1.Appearance = TabAppearance.FlatButtons;
tabControl1.ItemSize = new Size(0, 1);
tabControl1.SizeMode = TabSizeMode.Fixed;
TabControl.TabPageCollection tabCol=tabControl1.TabPages

        foreach (TabPage tp in tabCol)
        {
           if(condition)
            { 
              tabCol.Remove(tp);
            }
        }

该解决方案似乎效果良好-

  • 将Tabcontrol插入表单,默认名称为tabcontrol1

  • 确保在visual studio的“属性”窗格中选择了tabcontrol1,并更改以下属性:

    a。设置按钮的外观

    b。将ItemSize设置为0表示宽度,将ItemSize设置为1表示高度

    c。将“多行”设置为True

    d。将SizeMode设置为Fixed


  • 这最好在您完成设计时任务后完成,因为它也会将它们隐藏在设计器中,从而使导航变得困难

    在我的WinForms应用程序中,我可以通过将TabControl的y坐标定位在表单可见范围之外来解决这个问题,因此选项卡被有效隐藏。此示例仅适用于tabControl位于表单顶部附近的情况,但您已经明白了这一点

    private void frmOptions_Load(object sender, EventArgs e)
    {
        tabControl1.Top = -23; //Only tabPage contents visible
    }
    

    呃,这不是一种意见。这适用于所有Windows版本。嗨,如果左/右箭头也消失了,你能更新你的代码吗?(否则,当选项卡多于StackPanel框所能容纳的选项卡时,它们会显示)。非常感谢;能够动态切换视图非常方便。请将示例从
    类表控件
    编辑到
    公共类表控件
    ,以便在从其他程序集使用时显示在工具箱中。请在此回答中对代码进行解释!我认为您还希望重写此类中的OnKeyDown方法,以过滤掉Ctrl+Tab事件。如果(ke.KeyCode==Keys.Tab&&ke.Control)…在SO需要属性。@Hans抱歉,我听不懂你的话Hans说他已经发布了这个答案。您刚刚复制了它并再次发布。@volody Hans在MSDN上发布了它(以他的MSDN名称Nobugz)…好吧,我不是一个知道谁是创造者的向导