【问题标题】:Panel control gradient fill not working面板控制渐变填充不起作用
【发布时间】:2013-04-29 10:55:00
【问题描述】:

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

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

但它没有效果。如果我用表单替换 pnlBody,那么它会很好地为表单着色,但不会为面板着色。任何想法我做错了什么?谢谢!

【问题讨论】:

  • 你把这段代码放在哪里了?
  • @Tigran 在 formLoad 事件中,谢谢!
  • 您必须在控件的 OnPaint 覆盖内应用 gaidens,启用双缓冲和禁用背景重绘。

标签: c# background controls


【解决方案1】:

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

要解决这些问题,您应该从 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。

【讨论】:

  • 感谢详细解答,不胜感激!
  • 我可以使用这个作为一种通用方法来将此样式应用于整个应用程序中的选定面板吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 2017-10-29
相关资源
最近更新 更多