簡體   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