簡體   English   中英

如何創建沒有標簽標題的TabControl?

[英]How do I create a TabControl with no tab headers?

如何創建不顯示選項卡標題的選項卡管理器?

這是一個winforms應用程序,使用選項卡管理器的目的是只能通過代碼更改顯示內容。 它適用於各種菜單選項更改屏幕內容的菜單。

一旦你知道了這個技巧,隱藏標准TabControl上的標簽非常簡單。 當需要調整選項卡大小時,選項卡控件會發送TCM_ADJUSTRECT消息 ,因此我們只需要捕獲該消息。 (我確信之前已經回答過,但發布代碼比搜索代碼更容易。)

將以下代碼添加到項目中的新類,重新編譯,並使用CustomTabControl類而不是內置控件:

class CustomTabControl : TabControl
{
    private const int TCM_ADJUSTRECT = 0x1328;

    protected override void WndProc(ref Message m)
    {
        // Hide the tab headers at run-time
        if (m.Msg == TCM_ADJUSTRECT && !DesignMode)
        {
            m.Result = (IntPtr)1;
            return;
        }

        // call the base class implementation
        base.WndProc(ref m);
    }
}

(代碼示例最初來自Dot Net Ideas 。)

請注意,對於位於側面或底部的標簽頁眉,這將無法正常工作。 但這不僅看起來很奇怪,而且無論如何都無法在運行時看到標簽。 把它們放在它們所屬的頂部。

是的,如果它是Web應用程序,您可以使用相同的位置構建自己的DIV,並根據您的需要隱藏/顯示。

與其他人一起,我發現你的問題有點令人困惑。 我用發現這個方法在此之前。 使用這種方式,您可以更改一個屬性,以確定是否要顯示選項卡標題。

我想,使用面板是最簡單的解決方案。 另外,我建議使用我的(free,opensource) VisualStateManager來簡化切換並消除大量的.Enabled = true恐怖。

Nuget提供套餐

只需編寫此代碼:

// Contains and propagates information about current page
private SwitchCondition<int> settingPageCondition;
// Controls state of specific controls basing on given SwitchCondition
private VisualStateSwitchController<int> settingPageController;

// (...)

private void InitializeActions()
{
    // Initialize with possible options
    settingPageCondition = new SwitchCondition<int>(0, 1);

    settingPageController = new VisualStateSwitchController<int>(
        null,                  // Enabled is not controlled
        null,                  // Checked is not controlled
        settingPageCondition,  // Visible is controller by settingPageCondition
        new SwitchControlSet<int>(0, pGeneral),   // State 0 controls pGeneral
        new SwitchControlSet<int>(1, pParsing));  // State 1 controls pParsing
}

// (...)

public void MainForm()
{
    InitializeComponent();
    InitializeActions();
}

// (...)

// Wat to set specific page
settingPageCondition.Current = 0;

在編輯和評論使問題更清楚之后,我認為處理這個問題的正常方法是使用多個面板而不是標簽。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM