2010-12-07 88 views
1

我想在C#中創建一個Windows窗體,其中的文本不能被用戶修改或選擇。 我設法讓它不可改變(ReadOnly = true),但我仍然能夠選擇並突出顯示文本。阻止能夠在C#窗體中突出顯示文本框中的文本

我該如何改變這種情況?

謝謝!

-R

+1

你爲什麼想這麼做?你的內涵是什麼?你想通過這樣做來達到什麼目的?只是好奇:) – 2010-12-07 06:19:17

回答

0

使用label代替textbox。我認爲你只想顯示信息,但不選擇,不要複製,使用label將是更好的選擇...

+0

這樣做!我沒有意識到我可以使標籤看起來像一個文本框。愚蠢的問題。謝謝! – Russel 2010-12-07 06:37:14

0

是禁用它的一個選項? (Enabled = false)

1

這是預期的行爲,是由設計。如果在Windows資源管理器中右鍵單擊某個項目並打開其「屬性」窗口,您可以自己查看此內容。 「常規」選項卡上的所有動態文本字段均可選,但不可修改。 如果這不是您想要的行爲,您應該強烈考慮使用Label control代替。這是準確的情況 - 用戶不能選擇的靜態文本。

如果出於某種原因,您沒有出售,爲什麼您應該使用Label控件,我將繼續回答您提出的問題。 ,試圖覆蓋這種行爲(如覆蓋的任何控件的默認行爲)的是,有一個很多方式供用戶來完成它的主要問題:點擊並拖動鼠標,雙-clicking鼠標按鈕,使用鍵盤上的箭頭鍵結合的移位鍵,tab鍵切換到文本框中,
單擊鼠標右鍵,然後從上下文菜單等「全選」 ......

您的第一本能可能是重寫.NET Framework公開的潛在相關事件(如OnMouseDown,OnKeyDown等),並將所選長度重置爲0,以便在自動選擇文本後立即取消選擇。但是,這會在該過程中引起一點閃爍效應,這可能會或可能不會被您接受。

或者,您可以通過覆蓋控件的方法,監視相關的窗口消息以及防止消息完全傳遞到控件的基類來做同樣的事情。這將防止閃爍效應,因爲基本控制從未實際接收到一條消息,導致它自動選擇其文本,但它確實有明顯的副作用,防止控制因這些常見事件而採取任何操作。在這種情況下,對你來說這似乎不重要,但要意識到這仍然是一個非常激烈的破解。我肯定不能推薦它作爲良好做法。

這就是說,如果你仍然感興趣,你可以使用下面的自定義UnselectableTextBox類。它可以防止處理我可以想到的每個窗口消息,這些消息可能允許用戶選擇文本。它確實有效,但公平的警告:可能還有其他人我沒有想到。

public class UnselectableTextBox : TextBox 
{ 
    public UnselectableTextBox() : base() 
    { 
     //Set it to read only by default 
     this.ReadOnly = true; 
    } 

    protected override void OnGotFocus(System.EventArgs e) 
    { 
     base.OnGotFocus(e); 

     //Prevent contents from being selected initally on focus 
     this.DeselectAll(); 
    } 

    protected override void WndProc(ref System.Windows.Forms.Message m) 
    { 
     const int WM_KEYDOWN = 0x100; 
     const int WM_LBUTTONDOWN = 0x201; 
     const int WM_LBUTTONDBLCLK = 0x203; 
     const int WM_RBUTTONDOWN = 0x204; 

     if ((m.Msg == WM_KEYDOWN) || (m.Msg == WM_LBUTTONDOWN) || 
      (m.Msg == WM_LBUTTONDBLCLK) || (m.Msg == WM_RBUTTONDOWN)) 
     { 
      this.DeselectAll(); 
      return; 
     } 

     base.WndProc(ref m); 
    } 
}