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

Kri*_*ian 0 c# controls background

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

Brush brush = new LinearGradientBrush(pnlBody.ClientRectangle, Color.Black, Color.White, LinearGradientMode.ForwardDiagonal);
pnlBody.CreateGraphics().FillRectangle(brush, pnlBody.ClientRectangle);
Run Code Online (Sandbox Code Playgroud)

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

Han*_*ant 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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