面板控制渐变填充不起作用

时间:2013-04-29 10:55:00

标签: c# background controls

我有一个面板控件,我想填充渐变。我有以下代码:

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

但它没有效果。如果我用表单替换pnlBody,那么它会将表单的颜色设置为精细,而不是面板。我有什么想法我做错了吗?谢谢!

1 个答案:

答案 0 :(得分:6)

Panel控件将使用其Paint事件绘制自己。通过使用CreateGraphics()消除您绘制的任何内容。您需要使用其Paint事件。然而,这会产生闪烁,你会先看到它的背景。 Panel也经过优化,可以作为容器控件,具有低影响的油漆开销,您可以看到它在调整大小时不会重新绘制。将其锚定到右侧或底部并调整表单大小时出现问题。

要解决这些问题,您应该从Panel派生自己的类。在项目中添加一个新类并粘贴此代码:

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);
    }
}

构建+构建。将新控件从工具箱顶部拖放到表单上,替换原始面板。您可以通过添加选择渐变开始和结束颜色的属性来获得创意,从而生成一个更通用的控件,可以在其他项目中重用。避免显示滚动条的面板,由于Windows"显示窗口内容同时拖动"而不能使滚动看起来像样。特征。效果有点类似于pogo。