繁体   English   中英

如何在文本框中禁用光标?

[英]How to disable cursor in textbox?

有没有办法在不将属性 Enable 设置为 false 的情况下禁用文本框中的光标? 我试图使用 ReadOnly 属性,但尽管我无法在文本框中写入,但如果我单击文本框,则会出现光标。 那么有没有办法永久摆脱这个光标?

在 C# 中,您可以使用以下只读文本框:

public class ReadOnlyTextBox : TextBox
{
    [DllImport("user32.dll")]
    static extern bool HideCaret(IntPtr hWnd);

    public ReadOnlyTextBox()
    {
        this.ReadOnly = true;
        this.BackColor = Color.White;
        this.GotFocus += TextBoxGotFocus;
        this.Cursor = Cursors.Arrow; // mouse cursor like in other controls
    }

    private void TextBoxGotFocus(object sender, EventArgs args)
    {
        HideCaret(this.Handle);
    }
}

在 C# 中,您可以通过暂时禁用文本框中的光标,然后在收到焦点时重新启用文本框。 请注意,如果使用此方法,则无需将文本框设为只读。 例如:

private void TextBox_Enter(object sender, EventArgs e)
{
  TextBox.Enabled = false;
  TextBox.Enabled = true;
}

您可以改用Label 当在设计器中设置BorderStyle = Fixed3DBackColor = WindowAutoSize = False ,它看起来很像一个 TextBox。

但是,提供了 TextBox 中的光标,以便用户可以在文本比文本框长时滚动浏览。 使用 Label 将失去该功能,除非您确定它始终适合。 除此之外,无法从 TextBox 中删除光标。

将 hideCaret 函数放在 TextChanged 事件中将解决问题:

[DllImport("user32.dll")]
static extern bool HideCaret(IntPtr hWnd);

private void textBox1_TextChanged(object sender, EventArgs e)
{
    HideCaret(textBox1.Handle);
}

对我来说最简单的解决方案是覆盖 on focus 事件并将焦点返回给父级。 这可以防止光标和用户对文本框的任何编辑,并且基本上禁用文本框而不必设置 Enabled = false 属性。

private void Form1_load(object sender, EventArgs e) {
    textBox1.ReadOnly = true;
    textBox1.Cursor = Cursors.Arrow;
    textBox1.GotFocus += textBox1_GotFocus;
}


private void textBox1_GotFocus(object sender, EventArgs e) {
    ((TextBox)sender).Parent.Focus();
}

像@Mikhail Semenov 的解决方案一样,如果您没有很多文本框应该这样做,您也可以使用 lambda express 来快速禁用光标:

[DllImport("user32.dll")]
static extern bool HideCaret(IntPtr hWnd);

textBox1.ReadOnly = true;
textBox1.BackColor = Color.White;
textBox1.GotFocus += (s1, e1) => { HideCaret(textBox1.Handle); };
textBox1.Cursor = Cursors.Arrow;

您可以以编程方式设置它。

textBox1.Cursor = Cursors.Arrow;

这不是严格意义上的问题的答案,但也许它可以解决一些类似的问题。 我使用了一个文本框控件,它看起来像一个显示比例的控件的标签,但可以在单击时进行编辑。 启动 enabled = false 并在文本框控件的父级的鼠标处理程序中激活(启用 = true)(禁用时,边框无和背景色 = 父背景色,看起来像一个标签)。 例如,当输入命中或其他事件时,在 KeyDown 处理程序中再次禁用。 (当然,父鼠标点击例程可以检查鼠标点击是否真的发生在标签/文本框控件中)。 如果您需要通过 Tab 键激活文本框控件,则需要做更多的工作(比我所做的还要多)。 我使用表单构造函数在运行时查找文本框父级并应用委托鼠标控件。 也许您可以在编译时(Form header)也这样做,但这对我来说似乎有点容易出错。

一种方法是使用 View + TabIndex,您可以首先对对话框上的其他一些控件进行索引,如果有按钮的话。 然后就好像控件 tabIndex 不是第一个即 0,光标不会出现在那里。

试试这个,

private void SetText(string text)
{
     textBox1.ReadOnly = false;
     textBox1.Text = text;
     textBox1.ReadOnly = true;
}

您可以使用文本框的RightToLeft属性,将其设置为 true,您不会摆脱光标,但它会固定在右角,并且不会在您在文本框中输入每个文本后自动出现。 我已经用它开发了一个像 Windows Calculator 这样的应用程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM