2015-05-05 3 views
0

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

+0

'TabPage1.BackColor = Color.Transparent' Ставить в TabPage1 на имя вашего контроля и попытаться что .. – MethodMan

+0

Короче говоря, вы не можете. WinForms представляет собой оболочку вокруг собственных элементов управления Win32 и GDI, ни одна из которых не поддерживает истинный Z-порядок компонентов пользовательского интерфейса с альфа-каналами. Для этих эффектов вам нужно будет использовать WPF или другую инфраструктуру пользовательского интерфейса. – Dai

ответ

5

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(); 
} 
+0

Это работает удивительно хорошо. Я создал пользовательский элемент управления из этого класса и перетащил элемент управления в свою форму. Но во время разработки есть проблема: после запуска приложения управление стало полностью невидимым. Сразу после того, как я поместил элемент управления в свою форму, он выглядит так: http://prntscr.com/720szz после того, как я скомпилирую приложение и вернусь к дизайну VS GUI, он выглядит так: http://prntscr.com/720t4a Кажется, это но до сих пор я все еще могу сказать, перейдя в список элементов управления формы на ComboBox прямо над Property Grid. – Jack

+0

На самом деле, элемент 'TransparentTabControl' сам по себе больше не находится (после компиляции) только его вкладки: http://prntscr.com/720z9s – Jack

+0

Отмечено, OnParentChanged() был поздним изменением, а дизайнеру не нравится это очень. Я отразил проблему, теперь работает намного лучше. –

Смежные вопросы