Подтвердить что ты не робот

Скрыть вкладку Заголовок на С# TabControl

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

4b9b3361

Ответ 1

Вы можете заменить 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;

Ответ 2

Добавьте новый класс в свой проект и вставьте код, показанный ниже. Компиляция. Отбросьте новый элемент управления сверху панели инструментов на свою форму. Он показывает вкладки во время разработки, поэтому вы можете легко переключаться между ними во время проектирования. Они скрыты во время выполнения, используйте свойство 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);
  }
}

Ответ 3

Создайте новый 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

Ответ 4

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

Ответ 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 для ответа в С#

Ответ 6

В дополнение к существующему ответу Hans Passant, я нашел четыре способа скрыть стрелки от пользователя, когда количество вкладок превышает ширину 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:

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

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

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

Ответ 7

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

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

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

Должен работать для вас.

С уважением.

Ответ 8

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

TabControl.TabPageCollection tabCol = tabControl1.TabPages;

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