c# - 防止控件在禁用时变灰

标签 c# winforms

在 winforms .net 控件中,如果我们将 Enabled 属性设置为 false,控件将显示为灰色。

在这种情况下,许多颜色组合将变得不可读(因为我提供了在运行时为用户更改表单颜色的选项)。

我可以使用 ReadOnly 属性,但它仅适用于 TextBox 控件,不适用于 ComboBox、DateTimePicker 等其他控件。

我只是想知道是否有可用的选项,以便我可以防止控件在禁用时变灰。

最佳答案

在大多数可用性研究中,这是一个令人悲伤的时刻,看到受试者不停地敲击鼠标和键盘,却不明白为什么它不起作用。但如果你真的想要,你可以得到它。诀窍是在控件前面放置一个图片框,显示控件在其先前启用状态下的位图。他们永远不会弄清楚他们点击的是位图而不是实际控件。

最好使用面板来完成,这样您就可以轻松地禁用一组控件。向您的项目添加一个新类并粘贴如下所示的代码。编译。将工具箱顶部的新控件拖放到窗体上。并将应该禁用的控件放入其中。其他一切都是自动的,只需将 Enabled 属性设置为 false,用户将不知道发生了什么:

using System;
using System.Drawing;
using System.Windows.Forms;

class FakeItPanel : Panel {
    private PictureBox mFakeIt;

    public new bool Enabled {
        get { return base.Enabled; }
        set {
            if (value) {
                if (mFakeIt != null) mFakeIt.Dispose();
                mFakeIt = null;
            }
            else {
                mFakeIt = new PictureBox();
                mFakeIt.Size = this.Size;
                mFakeIt.Location = this.Location;
                var bmp = new Bitmap(this.Width, this.Height);
                this.DrawToBitmap(bmp, new Rectangle(Point.Empty, this.Size));
                mFakeIt.Image = bmp;
                this.Parent.Controls.Add(mFakeIt);
                this.Parent.Controls.SetChildIndex(mFakeIt, 0);
            }
            base.Enabled = value;
        }
    }

    protected override void Dispose(bool disposing) {
        if (disposing && mFakeIt != null) mFakeIt.Dispose();
        base.Dispose(disposing);
    }
}

关于c# - 防止控件在禁用时变灰,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3324038/

相关文章:

c# - 多个搜索框

c# - 命名空间在构建 RELEASE 时消失,但在 DEBUG 时存在

c# - 如何使用FileSavePicker保存现有的StorageFile?

c# - 分配当前单元格数据 GridView 时出现异常

c# - 如果我不在笔对象上调用 Dispose 会发生什么?

c# - Resharper 测试运行器不输出 Console.WriteLine()?

c# - 在多个订阅者的情况下,委托(delegate)如何知道调用哪个函数

C# BackgroundWorker 不工作

c# - 用C#生成完全随机的偶数

c++ - WINFORM C++ Managed string->unmanaged string 在与 fstream 结合使用时产生意外结果