面板控制渐变填充不工作

本文关键字:工作 填充 渐变 控制 | 更新日期: 2023-09-27 18:11:24

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

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

但是没有效果。如果我用form替换pnlBody,那么它会给form上色,但不会给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。