2010-12-07 130 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); 
    } 
}