【问题标题】:Hide Tab Header on C# TabControl在 C# TabControl 上隐藏选项卡标题
【发布时间】:2011-08-05 08:31:09
【问题描述】:

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

【问题讨论】:

  • @Dan W 没有顶部拇指/选择器的TabPagePanel 有何显着不同?
  • @Plutonix:因为在设计器中,通过切换标签在不同的小部件组之间切换会容易得多。
  • myPanelTabs(n).BringToFront 完成。或弄乱可见的。
  • @Plutonix:虽然这是代码,但我希望能够在表单设计器中通过单击来切换给定区域中的内容。
  • @MickyDuncan:在用户看来,该程序绝不是一个向导。根据他们选择的软件版本,他们只能看到其中一个选项卡,而其他选项卡/页面将永久无法访问,因为它们无关紧要。但是,是的,开发人员可以使用这个想法来实现一个向导类型系统。

标签: c# winforms tabcontrol


【解决方案1】:

向您的项目添加一个新类并粘贴如下所示的代码。编译。将新控件从工具箱顶部拖放到表单上。它在设计时显示选项卡,因此您可以在设计时轻松地在它们之间切换。它们在运行时隐藏,使用代码中的 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);
  }
}

【讨论】:

  • 呃,这不是意见。这适用于所有 Windows 版本。
  • 您好,您能否在左/右箭头也消失的情况下更新您的代码? (它们否则显示更多标签时比StackPanel Box的包含更多标签)。非常感谢;能够像这样动态切换视图非常方便。
  • 请将您的示例从 class TablessControl 编辑为 public class TablessControl,以便在从其他程序集中使用它时显示在工具箱中。
  • 对此答案中的代码解释将不胜感激!
  • 我想你也想在这个类中重写 OnKeyDown 方法来过滤掉 Ctrl+Tab 事件。 if (ke.KeyCode == Keys.Tab && ke.Control)...
【解决方案2】:
tabControl1.Appearance = TabAppearance.FlatButtons;
tabControl1.ItemSize = new Size(0, 1);
tabControl1.SizeMode = TabSizeMode.Fixed;

【讨论】:

  • 避免仅使用代码的答案。添加一些关于您的解决方案的描述。
  • 这是迄今为止最简单的方法,对我来说效果很好。如果您愿意,可以在设计器的属性中进行。
  • 避免创建新的继承控件的解决方案。做得很好。
  • 很遗憾,这个问题的最佳答案背后有 zero 解释。您可以在设计器道具中设置除ItemSize 之外的所有内容,只需在PageLoad 上设置ItemSize。恕我直言,这应该是最佳答案。不过,MS 应该只是将此功能作为一个选项。
  • 另外,你可能想要使用 tabControl1.TabStop = False;
【解决方案3】:

创建新的用户控件,例如将其命名为 TabControlWithoutHeader 并将继承的用户控件更改为 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);
    }
}

编译后你将在 ToolBox 中拥有 TabControlWithoutHeader 控件。将其放在表单上,​​在设计器中您会看到标题,但在运行时它们会被隐藏。如果您也想将它们隐藏在设计器中,请删除 && !DesignMode

希望对您有所帮助。

http://social.msdn.microsoft.com/Forums/windows/en-US/c290832f-3b84-4200-aa4a-7a5dc4b8b5bb/tabs-in-winform?forum=winforms

【讨论】:

  • SO 需要署名。
  • @Hans 抱歉,我看不懂你写的内容
  • 汉斯说他已经发布了这个答案。您刚刚复制并再次发布。
  • @volody Hans 将其发布在 MSDN 上(以他的 MSDN 名称 Nobugz)back in 2007...
  • 好吧,我不是知道谁是原始代码的创建者,尤其是谁在不同站点以不同昵称隐藏的向导。所以感谢@MatthewWatson 解释其他地方在说什么。 :)
【解决方案4】:

您可以将 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;
  }
}

然后添加页面并设置当前可见页面:

MultiPagePanel p;

// MyTabPage is a Control derived class that represents one page on your form.
MyTabPage page = new MyTabPage(); 
p.AddPage(page);

p.CurrentPageIndex = 0;

【讨论】:

  • 刚刚偶然发现这个线程,发现一个错误:if (value >= 0 && value = 0 && value
【解决方案5】:

我需要这段代码,但在 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# 中的回答

【讨论】:

【解决方案6】:

补充Hans Passant的现有答案,我发现了四种方法来从用户隐藏箭头,当标签的数量超过TableConControl的宽度时。没有单一的解决方案一定适合所有人,但可能适合您(或至少是它们的组合)。

解决方案 1:

只需启用Multiline。这将防止箭头首先出现。但是,请记住,您可能会在设计器中失去所见即所得,因为垂直空间将垂直向下调整,并且 TablessControl 中的控件甚至可能在底部被“切掉”(同样,仅在开发人员模式下)。

解决方案 2:

解决上述所见即所得问题的更高级的解决方案是仅在程序运行后启用Multiline。只需将此构造函数添加到 TablessControl 类:

public TablessControl()
{
    bool designMode = (LicenseManager.UsageMode == LicenseUsageMode.Designtime);
    if (!designMode) Multiline = true;      
}

对于开发者来说,它们仍然会显示为一行标签。

解决方案 3:

减小 TablessControl 的字体大小。每个选项卡应相应缩小。由于用户永远无法看到选项卡,因此即使将字体大小设置为 4pt 也没什么关系。

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

这种方法还有一个优点是可以更接近地向开发人员展示真正的所见即所得的垂直房地产(对于用户来说可能看起来不错,但由于高度的原因可能会在设计人员的底部被略微切断标签)。

此方案可与方案一和方案二结合,累积优势。

解决方案 4:

如果任何选项卡的文本都很长,则此解决方案不一定很好。感谢 Hans 的建议。

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

本方案可与上述方案结合,进一步积累优势。

【讨论】:

    【解决方案7】:

    如果你真的想这样做,你可以这样做

     tcActionControls.Region = new Region(new RectangleF(
                 tbPageToShow.Left, 
                   tbPageToShow.Top, 
                     tbPageToShow.Width, 
                        tbPageToShow.Height)
    );
    

    tcActionControls 是你的 TabControltbPageToShowTabPage,在这个精确的时刻显示。

    应该为你工作。

    问候。

    【讨论】:

      【解决方案8】:

      这个解决方案似乎运作良好 - How to hide tabs in the tab control?

      1. 将 Tabcontrol 插入表单,默认名称为 tabcontrol1。

      2. 确保在 Visual Studio 的“属性”窗格中选择了 tabcontrol1,并更改以下属性:

        一个。为按钮设置外观

        b.将 ItemSize 设置为宽度为 0,高度为 1

        c。将多行设置为 True

        d。将 SizeMode 设置为 Fixed

      这最好在您完成设计时任务后完成,因为它也将它们隐藏在设计器中 - 使其难以导航!

      【讨论】:

        【解决方案9】:

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

        TabControl.TabPageCollection tabCol = tabControl1.TabPages;

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

        【讨论】:

        • 问题是关于删除可见选项卡内容顶部的 HEADER ROW(包含选项卡名称)。这不是该问题的答案。
        • tabControl.Appearance = TabAppearance.FlatButtons; tabControl.ItemSize = new Size(0, 1); tabControl.SizeMode = TabSizeMode.Fixed; foreach (tabControl.TabPages 中的 TabPage 选项卡) { tab.Text = ""; }
        【解决方案10】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-09-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-19
          • 1970-01-01
          相关资源
          最近更新 更多