如何更改禁用文本框的字体颜色?

71

有人知道哪个属性设置禁用控件的文本颜色吗?我需要在禁用的TextBox中显示一些文本,并将其颜色设置为黑色。


3
Cheeta的回答是正确的。考虑重新标记吗? - user172632
9个回答

73

注意:请查看下面Cheetah的答案,因为它确定了一个前提条件才能使此解决方案工作。设置TextBoxBackColor


我认为你真正想做的是启用TextBox并将ReadOnly属性设置为true

在禁用的TextBox中更改文本的颜色有点棘手。我认为你可能必须子类化并重写OnPaint事件。

ReadOnly可以让你获得与!Enabled相同的结果,并允许你控制TextBox的颜色和格式。我认为它仍然支持从TextBox选择和复制文本,而这在禁用的TextBox中不可能。

另一个简单的替代方法是使用Label而不是TextBox


如果这是你的答案,请继续点击“为我检查” :) - Eric Schoonover
这不是一个确切的答案,但它是一个公平的替代方案;) - Niko Gamulin
如果有更准确的答案,请随意更改,这是正确的。 - Eric Schoonover
如果我继续寻找确切的答案,我会去做它。 - Niko Gamulin
只有在想使用黑色的情况下才有效。但仍无法使用Foreground属性来控制颜色。 - giltanis

59

此外,在标记为只读的文本框上遵守ForeColor,您必须明确设置BackColor。如果要仍然使用默认的BackColor,您必须进行显式设置,因为设计器在这里太聪明了。将BackColor设置为其当前值就足够了。我在窗体的Load事件中这样做:

private void FormFoo_Load(...) {
    txtFoo.BackColor = txtFoo.BackColor;
}

5
据我所记,有一个标志可以检查颜色是否已被自定义。只有在设置了BackColor时,该标志才会被设置。我现在找不到它了,但如果你在Reflector中仔细搜索的话,可能会找到。 - Cheetah

7

我刚刚找到了一种很好的方法。在我的示例中,我使用了 RichTextBox,但是它应该适用于任何控件:

public class DisabledRichTextBox : System.Windows.Forms.RichTextBox
{
    // See: http://wiki.winehq.org/List_Of_Windows_Messages

    private const int WM_SETFOCUS   = 0x07;
    private const int WM_ENABLE     = 0x0A;
    private const int WM_SETCURSOR  = 0x20;

    protected override void WndProc(ref System.Windows.Forms.Message m)
    {
        if (!(m.Msg == WM_SETFOCUS || m.Msg == WM_ENABLE || m.Msg == WM_SETCURSOR))
            base.WndProc(ref m);
    }
}

你可以安全地将Enabled设置为true,ReadOnly设置为false,它将像标签一样运行,防止焦点、用户输入和光标更改,而不会实际禁用。
看看它是否适合你。 问候

5

您好,将 readonly 属性设置为 true 应该在代码或运行时而不是设计时进行。

txtFingerPrints.BackColor = System.Drawing.SystemColors.Info;
txtFingerPrints.ReadOnly = true;

3
你可以尝试这个方法。重写文本框的OnPaint事件。
    protected override void OnPaint(PaintEventArgs e)
{
     SolidBrush drawBrush = new SolidBrush(ForeColor); //Use the ForeColor property
     // Draw string to screen.
     e.Graphics.DrawString(Text, Font, drawBrush, 0f,0f); //Use the Font property
}

将 ControlStyles 设置为 "UserPaint"。
public MyTextBox()//constructor
{
     // This call is required by the Windows.Forms Form Designer.
     this.SetStyle(ControlStyles.UserPaint,true);

     InitializeComponent();

     // TODO: Add any initialization after the InitForm call
}

参考

或者您可以尝试这个技巧

在“Enter”事件中设置焦点

int index=this.Controls.IndexOf(this.textBox1);

this.Controls[index-1].Focus();

因此,您的控件将无法聚焦并像禁用一样运行。

1
只需处理启用更改并将其设置为所需的颜色即可。
private void TextBoxName_EnabledChanged(System.Object sender, System.EventArgs e)
{
    ((TextBox)sender).ForeColor = Color.Black;
}

1
如果您想显示无法编辑或选择的文本,您可以简单地使用标签。

1

将“只读”设置为“True”是最简单的方法。


1
除了@spoon16和@Cheetah的回答外,我总是在文本框上将tabstop属性设置为False,以防止默认选择文本。
或者,您也可以像这样做:
private void FormFoo_Load(...) {
    txtFoo.Select(0, 0);
}

or

private void FormFoo_Load(...) {
    txtFoo.SelectionLength = 0;
}

将TabStop设置为false非常重要,以避免只读控件意外获得焦点。 - Mike Paisner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接