【问题标题】:How can I make a transparent tabPage?如何制作透明的tabPage?
【发布时间】:2015-05-06 15:36:13
【问题描述】:

如何制作透明的tabPage?我找到了解决方案,例如将 Form 的 BackColorTransparencyKey 设置为 Color.LimeGreen 之类的颜色或使用空方法覆盖 OnPaintBackground 但 TabPage 既没有 TransparencyKeyproperty norOnPaintBackground` 方法。我该怎么做?

【问题讨论】:

  • TabPage1.BackColor = Color.Transparent 将 TabPage1 更改为您的控件的名称,然后尝试..
  • 简而言之,你不能。 WinForms 是原生 Win32 控件和 GDI 的包装器,它们都不支持具有 alpha 通道的 UI 组件的真正 Z 顺序。对于这些类型的效果,您需要使用 WPF 或其他 UI 框架。

标签: c# winforms tabcontrol transparent tabpage


【解决方案1】:

TabControl 是一个原生的 Windows 组件,它总是绘制不透明的标签页,没有内置的透明度支持。解决这个问题需要一些开箱即用的思维帮助,带有透明标签页的标签控件只是简单地转移到标签条可见。您所要做的就是使用面板来承载现在位于标签页上的控件,并通过 SelectedIndexChanged 事件使正确的控件可见。

最好将其粘贴在派生类中,这样您仍然可以在设计时正常使用选项卡控件。向您的项目添加一个新类并粘贴如下所示的代码。编译。将新控件从工具箱顶部拖放到窗体上,替换现有控件。

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

class TransparentTabControl : TabControl {
    private List<Panel> pages = new List<Panel>();

    public void MakeTransparent() {
        if (TabCount == 0) throw new InvalidOperationException();
        var height = GetTabRect(0).Bottom;
        // Move controls to panels
        for (int tab = 0; tab < TabCount; ++tab) {
            var page = new Panel {
                Left = this.Left, Top = this.Top + height,
                Width = this.Width, Height = this.Height - height,
                BackColor = Color.Transparent,
                Visible = tab == this.SelectedIndex
            };
            for (int ix = TabPages[tab].Controls.Count - 1; ix >= 0; --ix) {
                TabPages[tab].Controls[ix].Parent = page;
            }
            pages.Add(page);
            this.Parent.Controls.Add(page);
        }
        this.Height = height /* + 1 */;
    }

    protected override void OnSelectedIndexChanged(EventArgs e) {
        base.OnSelectedIndexChanged(e);
        for (int tab = 0; tab < pages.Count; ++tab) {
            pages[tab].Visible = tab == SelectedIndex;
        }
    }

    protected override void Dispose(bool disposing) {
        if (disposing) foreach (var page in pages) page.Dispose();
        base.Dispose(disposing);
    }
}

在表单的 Load 事件处理程序中调用 MakeTransparent() 方法:

private void Form1_Load(object sender, EventArgs e) {
    transparentTabControl1.MakeTransparent();
}

【讨论】:

  • 这非常好用。我从这个类创建了一个自定义控件并将该控件拖到我的表单中。但是在设计时有一个问题:一旦我运行应用程序,控件就变得完全不可见。在我将控件放在表单上之后,它看起来像这样 prntscr.com/720szz 在我编译应用程序并返回到 VS GUI 设计器之后,它看起来像这样:prntscr.com/720t4a 它似乎已经消失了,但到目前为止它仍然存在,我可以通过查看来判断在属性网格正上方的 ComboBox 上的表单控件列表中。
  • 实际上,TransparentTabControl 控件本身不再存在(编译后)只有它的 TabPages:prntscr.com/720z9s
  • 注意,OnParentChanged() 是一个较晚的更改,设计者不太喜欢它。我解决了这个问题,现在效果好多了。
  • 这太棒了!我知道它是如何工作的,甚至没有我认为让它透明的那么复杂。您的代码总是那几条优雅的线条!
  • 一段不错的代码,但是当您在表单上绘制渐变背景时它不起作用。
猜你喜欢
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
  • 2023-03-23
  • 1970-01-01
  • 2016-04-09
相关资源
最近更新 更多