Скрыть заголовок вкладки в C # TabControl - PullRequest
43 голосов
/ 05 августа 2011

Я разрабатываю приложение Windows Form с несколькими страницами. Я использую TabControl для реализации этого. Вместо того, чтобы использовать заголовок для переключения между вкладками, я хочу, чтобы мое приложение контролировало это, например. следующая вкладка должна открыться после того, как пользователь заполнил текстовое поле и нажал следующую кнопку.

Ответы [ 9 ]

95 голосов
/ 05 августа 2011

Добавьте новый класс в ваш проект и вставьте код, показанный ниже. Компиляция. Перетащите новый элемент управления из верхней части панели инструментов на форму. Он показывает вкладки во время разработки, поэтому вы можете легко переключаться между ними во время разработки. Они скрыты во время выполнения, используйте свойство 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);
  }
}
20 голосов
/ 14 мая 2015
tabControl1.Appearance = TabAppearance.FlatButtons;
tabControl1.ItemSize = new Size(0, 1);
tabControl1.SizeMode = TabSizeMode.Fixed;
16 голосов
/ 05 августа 2011

Создайте новый 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 в ToolBox.Перетащите его на форму, в конструкторе вы увидите заголовки, но во время выполнения они будут скрыты.Если вы хотите скрыть их и в конструкторе, удалите && !DesignMode.

Надеюсь, это поможет.

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

14 голосов
/ 05 августа 2011

Вы можете заменить 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;
9 голосов
/ 08 октября 2012

Мне нужен был этот код, но на 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 голосов
/ 17 апреля 2015

В дополнение к существующему ответу Ханса Пассанта я нашел четыре способа скрыть стрелки от пользователя, когда количество вкладок превышает ширину TablessControl.Ни одно решение не является идеальным для всех, но может быть для вас (или хотя бы их комбинации).

Решение 1:

Просто включите Multiline.Это предотвратит появление стрелок в первую очередь.Однако имейте в виду, что вы можете потерять WYSIWYG в конструкторе, потому что вертикальное пространство будет отрегулировано вертикально вниз, а элементы управления в TablessControl могут даже «обрезаться» внизу (опять же, только в режиме разработчика).

Решение 2:

Более продвинутое решение, которое решает описанную выше проблему WYSIWYG, заключается в том, чтобы включить Multiline только после запуска программы.Просто добавьте этот конструктор в класс TablessControl:

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

Для разработчика они все равно будут отображаться в виде одной строки вкладок.

Решение 3:

Уменьшитеразмер шрифта TablessControl.Каждая вкладка должна уменьшаться соответственно.Поскольку пользователь никогда не увидит вкладки, это не должно иметь большого значения, если вы установите размер шрифта равным 4pt.

Однако будьте осторожны, поскольку содержимое TablessControl также может быть изменено.Если это произойдет, заново отредактируйте размер шрифта для каждого виджета внутри, и в этот момент они, к счастью, останутся с этим размером, даже если вы затем решите снова изменить размер шрифта основного TablessControl.

Этот подход также имеет то преимущество, что он более точно показывает истинную вертикальную недвижимость WYSIWYG для разработчика (которая может хорошо выглядеть для пользователя, но может быть слегка обрезана внизу в конструкторе из-за высоты вкладок).

Это решение может быть объединено с Решением 1 и 2. Для получения накопленных преимуществ.

Решение 4:

Это решение не обязательно настолько велико, если на любой из вкладок есть тексткоторые длинныеСпасибо Гансу за предложение.

Сначала установите SizeMode TablessControl в значение 'Fixed', а затем уменьшите свойство ItemSize Width TablessControl до меньшего числа, чтобы уменьшить ширину каждой вкладки.Не стесняйтесь также настроить свойство ItemSize Height, чтобы помочь решить вышеупомянутую проблему WYSIWYG, хотя решение 3 может быть более полезным для этой проблемы.

Это решение может быть объединено с вышеупомянутыми решениями для дальнейшего накопленияпреимущества.

4 голосов
/ 05 августа 2011

Если вы действительно хотите сделать это, вы можете сделать что-то вроде этого

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

Где tcActionControls - ваш TabControl, а tbPageToShow - TabPage, чтобы показать в этот точный момент.

Если будет работать на вас.

Привет.

1 голос
/ 26 ноября 2018

Похоже, это решение хорошо работает - Как скрыть вкладки в элементе управления вкладками?

  1. Вставить Tabcontrol в форму, имя по умолчанию - tabcontrol1.

  2. Убедитесь, что tabcontrol1 выбран на панели свойств в Visual Studio, и измените следующие свойства:

    a.Установите вид для кнопок

    b.Установите ItemSize 0 для ширины и 1 для высоты

    c.Установите для Multiline значение True

    d.Установите для параметра SizeMode значение Fixed

Это лучше всего делать после того, как вы закончили свои задачи времени проектирования, поскольку оно также скрывает их в конструкторе - затрудняя навигацию!

1 голос
/ 20 января 2016

Вы можете попробовать удалить TabPage из коллекции TabPageCollection:

TabControl.TabPageCollection tabCol = tabControl1.TabPages;

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