2013-04-29 87 views
0

我有一個面板控件,我想用漸變填充。我有以下代碼:面板控制漸變填充不起作用

Brush brush = new LinearGradientBrush(pnlBody.ClientRectangle, Color.Black, Color.White, LinearGradientMode.ForwardDiagonal); 
pnlBody.CreateGraphics().FillRectangle(brush, pnlBody.ClientRectangle); 

但它沒有效果。如果我用表單替換pnlBody,那麼它將表單顏色好,但不是面板。任何想法我做錯了什麼?謝謝!

+0

你把這段代碼放在哪裏? – Tigran 2013-04-29 10:57:30

+0

@Tigran在formLoad活動中,謝謝! – Kristian 2013-04-29 11:06:33

+0

您必須在控件的OnPaint覆蓋內應用graidens,啓用雙緩衝和可分離的背景重繪。 – Tigran 2013-04-29 11:24:48

回答

6

Panel控件將使用其Paint事件繪製自己。它通過使用CreateGraphics()擦除任何你繪製的東西。您將需要使用其Paint事件。然而,這會產生閃爍,你會看到它首先繪製其背景。面板也經過優化,可以充當具有低影響的油漆開銷的容器控制,您會發現它在調整大小時不會重新繪製。將其固定到右側或底部並調整窗體大小時出現問題。

要解決這些問題,您應該從面板派生自己的類。添加一個新類到您的項目並粘貼此代碼:

using System; 
using System.Drawing; 
using System.Drawing.Drawing2D; 
using System.Windows.Forms; 

public class GradientPanel : Panel { 
    public GradientPanel() { 
     this.ResizeRedraw = true; 
    } 
    protected override void OnPaintBackground(PaintEventArgs e) { 
     using (var brush = new LinearGradientBrush(this.ClientRectangle, 
        Color.Black, Color.White, LinearGradientMode.ForwardDiagonal)) { 
      e.Graphics.FillRectangle(brush, this.ClientRectangle); 
     } 
    } 
    protected override void OnScroll(ScrollEventArgs se) { 
     this.Invalidate(); 
     base.OnScroll(se); 
    } 
} 

Build + Build。將新的控件從工具箱的頂部放到窗體上,替換原來的面板。您可以通過添加選擇漸變開始和結束顏色的屬性來獲得創意,從而產生可在其他項目中重複使用的更普遍有用的控件。避免顯示滾動條的面板,由於Windows「拖動時顯示窗口內容」功能,您無法使滾動顯示得當。效果有點類似於pogo。

+0

感謝您的詳細解答,非常感謝! – Kristian 2013-04-30 11:55:08