如何获得一个看起来像没有标签的TabControl的控件?

时间:2009-02-20 09:47:28

标签: c# .net winforms tabcontrol

我们有一个表单,可以在选项卡控件的标签页中显示媒体项目,我正在实现一项功能,允许用户将标签页“弹出”到自己的表单中。

但是,当我将媒体播放器添加到表单而不是TabPage时,背景会从标签页的渐变填充切换到父窗体的普通SystemColors.Control背景。我需要将媒体播放器添加到控件中,该控件具有与TabControl相同的背景,但不会在顶部显示选项卡。我尝试将媒体播放器添加到TabControl的控件集合中,但这只会引发异常。

如何获得一个看起来像没有标签的TabControl的控件?我应该继续尝试将媒体播放器添加到TabControl,还是应该尝试编写具有自定义绘制背景的面板?如果是后者,我如何确保它适用于所有可能的主题?

4 个答案:

答案 0 :(得分:3)

问题似乎与UseVisbleBackgroundStyle有关。仅AFAIK按钮和TabPages具有此属性。

以下是一个非常脏的黑客,只是为了让你开始:

1)从Panel派生customControl并添加“using System.Windows.Forms.VisualStyles;”

2)添加以下代码

//warning: incomplete, add error checking etc
private readonly VisualStyleElement element = VisualStyleElement.Tab.Body.Normal;
public bool UseVisbleBackgroundStyle { get; set; }

protected override void OnPaint(PaintEventArgs pe)
{
    if (UseVisbleBackgroundStyle)
    {
        var x = new VisualStyleRenderer(element);                           
        x.DrawBackground(pe.Graphics, this.ClientRectangle);
    }
    else
    {
        base.OnPaint(pe);
    }
}

答案 1 :(得分:3)

感谢Henk - 我最终选择了:

protected override void OnPaintBackground(PaintEventArgs e)
{
    if (TabRenderer.IsSupported && Application.RenderWithVisualStyles)
    {
        TabRenderer.DrawTabPage(pe.Graphics, this.ClientRectangle);
    }
    else
    {
        base.OnPaintBackground(pe);
        ControlPaint.DrawBorder3D(pe.Graphics, this.ClientRectangle, Border3DStyle.Raised);
    }
}

答案 2 :(得分:0)

尝试创建自己的客户UserControl

答案 3 :(得分:0)

此答案是从另一个answer site修改的。它干得很干净。

在包含制表符控件的窗口的加载事件中,请尝试:

// TabControl is the name of the tab control in this window.
TabControl.Appearance = TabAppearance.FlatButtons;
TabControl.Multiline = false;
TabControl.SizeMode = TabSizeMode.Fixed;
TabControl.ItemSize = new Size(0,1);

// The tabs are now gone.  Select the panel you want to display
TabControl.SelectTab("InProgressTab");