Как я могу сделать прозрачную вкладку?

Как я могу сделать прозрачную вкладку? Я нашел такие решения, как установить для форм BackColor и TransparencyKey цвет, подобный Color.LimeGreen, или переопределить OnPaintBackground с помощью пустого метода, но TabPage не имеет ни метода TransparencyKeyproperty norOnPaintBackground`. Как я могу это сделать?


person Jack    schedule 05.05.2015    source источник
comment
TabPage1.BackColor = Color.Transparent измените TabPage1 на имя вашего элемента управления и попробуйте это.   -  person MethodMan    schedule 05.05.2015
comment
Короче говоря, вы не можете. WinForms — это оболочка для собственных элементов управления Win32 и GDI, ни один из которых не поддерживает истинное Z-упорядочение компонентов пользовательского интерфейса с альфа-каналами. Для таких эффектов вам понадобится WPF или другой фреймворк пользовательского интерфейса.   -  person Dai    schedule 05.05.2015


Ответы (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);
    }
}

Вызовите метод MakeTransparent() в обработчике событий Load формы:

private void Form1_Load(object sender, EventArgs e) {
    transparentTabControl1.MakeTransparent();
}
person Hans Passant    schedule 05.05.2015
comment
Это работает удивительно хорошо. Я создал пользовательский элемент управления из этого класса и перетащил элемент управления в свою форму. Но есть проблема во время разработки: как только я запускаю приложение, элемент управления становится полностью невидимым. Сразу после того, как я поместил элемент управления в форму, он выглядит так: prntscr.com/720szz после компиляции приложения и вернуться к VS GUI Designer, он выглядит так: prntscr.com/720t4a Кажется, его больше нет, но он все еще там, так что Насколько я могу судить, взглянув на список элементов управления в форме ComboBox прямо над сеткой свойств. - person Jack; 06.05.2015
comment
На самом деле, самого элемента управления TransparentTabControl там больше нет (после компиляции), только его вкладки: prntscr.com/720z9s - person Jack; 06.05.2015
comment
Отмечено, что OnParentChanged() было поздним изменением, и дизайнеру это не очень нравится. Я решил проблему, теперь работает намного лучше. - person Hans Passant; 06.05.2015
comment
Это круто! Я понимаю, как это работает, и даже не так сложно, как я думал, сделать его прозрачным. Ваш код всегда состоял из элегантных строк! - person Jack; 06.05.2015
comment
Хороший фрагмент кода, но он не работает, когда вы рисуете градиентный фон в форме. - person LuckyLuke82; 16.06.2017