2013-04-29 85 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