web-dev-qa-db-ja.com

C#TabControlのタブヘッダーを非表示

複数のページを含むWindowsフォームアプリケーションを開発しています。これを実装するためにTabControlを使用しています。ヘッダーを使用してタブを切り替える代わりに、アプリケーションでこれを制御したいユーザーがテキストボックスに入力して[次へ]ボタンをクリックすると、次のタブが開きます。

44

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;

プロジェクトに新しいクラスを追加し、以下に示すコードを貼り付けます。コンパイル。ツールボックスの上部からフォームに新しいコントロールをドロップします。設計時にタブが表示されるため、設計中にタブを簡単に切り替えることができます。これらは実行時に非表示になります。コードで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);
  }
}
96
Hans Passant
tabControl1.Appearance = TabAppearance.FlatButtons;
tabControl1.ItemSize = new Size(0, 1);
tabControl1.SizeMode = TabSizeMode.Fixed;
20
Geograph

新しい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コントロールが作成されます。フォームにドロップすると、デザイナーではヘッダーが表示されますが、実行時にはヘッダーは非表示になります。デザイナーでもそれらを非表示にする場合は、&& !DesignMode

お役に立てば幸いです。

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

16
Reniuz

このコードが必要でしたが、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

そして、C#での回答について@Hans Passantに感謝します。

10
abottoni

Hans Passantの既存の答えを補完するために、タブの数がTablessControlの幅を超えたときにユーザーから矢印を非表示にする4つの方法を見つけました。必ずしもすべての人にとって完璧なソリューションはありませんが、あなた(または少なくともそれらの組み合わせ)に適している場合があります。

解決策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のItemSizeWidthプロパティを小さい値に設定して、各タブの幅を小さくします。前述のWYSIWYGの問題に対処するために、ItemSizeHeightプロパティを調整することもお気軽に行ってください。ただし、ソリューション3はその問題に役立つ場合があります。

このソリューションを上記のソリューションと組み合わせて、さらに利点を蓄積できます。

6
Dan W

本当にこれをしたいなら、あなたはこのようなことをすることができます

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

tcActionControlsTabControlであり、tbPageToShowTabPageです。この正確な瞬間に表示します。

Shouldあなたのために働く。

よろしく。

4
Tigran

TabPageCollectionからTabPageを削除してみてください:

TabControl.TabPageCollection tabCol = tabControl1.TabPages;

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

このソリューションはうまく機能しているようです- タブコントロールでタブを非表示にする方法?

  1. フォームにTabcontrolを挿入します。デフォルトの名前はtabcontrol1です。

  2. Visual Studioの[プロパティ]ペインでtabcontrol1が選択されていることを確認し、次のプロパティを変更します。

    a。外観をボタンに設定

    b。幅にItemSize 0を設定し、高さに1を設定します

    c。マルチラインをTrueに設定

    d。 SizeModeをFixedに設定します

これは、設計時にタスクを非表示にするので、設計時のタスクを完了した後に行うのが最適です-ナビゲートが困難になります!

1
Adrian Brown