【发布时间】:2011-05-21 09:48:43
【问题描述】:
我想用 C# 创建一个带有文本框的 Windows 窗体,其文本不能由用户更改或选择。
我设法使它不可更改 (ReadOnly = true),但我仍然能够选择并突出显示文本。
我该如何更改?
谢谢!
-R
【问题讨论】:
-
你为什么要这样做?你的意图是什么,你想通过这样做来达到什么目的?只是好奇:)
标签: c# winforms textbox highlighting
我想用 C# 创建一个带有文本框的 Windows 窗体,其文本不能由用户更改或选择。
我设法使它不可更改 (ReadOnly = true),但我仍然能够选择并突出显示文本。
我该如何更改?
谢谢!
-R
【问题讨论】:
标签: c# winforms textbox highlighting
这是预期的行为,是设计使然。如果您在 Windows 资源管理器中右键单击某个项目并打开其“属性”窗口,您可以自己看到这一点。 “常规”选项卡上的所有动态文本字段都是可选择的,但不可修改。 如果这不是您想要的行为,您应该强烈考虑改用Label control。这正是它的预期用途——用户无法选择的静态文本。 p>
如果出于某种原因,您不知道为什么应该使用Label 控件,我将继续回答您提出的问题。 尝试覆盖此行为的主要问题(如覆盖任何控件的默认行为)存在很多用户完成它的方法: 用鼠标单击并拖动,双击鼠标按钮,使用键盘上的箭头键结合 Shift 键,Tab 键进入文本框,
右键单击并从上下文菜单中选择“全选”等...
您的第一反应可能是覆盖 .NET Framework 公开的潜在相关事件(例如 OnMouseDown、OnKeyDown 等)并将所选长度重置为 0,以便文本立即 自动选中后取消选中。但是,这会在处理过程中产生一点点闪烁效果,您可能接受也可能不接受。
或者,您可以通过覆盖控件的WndProc 方法、监视相关的窗口消息并完全阻止消息传递到控件的基类来执行相同的操作。这将防止闪烁效果,因为基本TextBox 控件实际上从未收到导致其自动选择其文本的消息,但它确实具有明显的副作用,即阻止控件因这些常见事件而采取任何行动。在这种情况下,这似乎对你来说可能无关紧要,但要意识到这仍然是一个非常激烈的黑客攻击。我绝对不能推荐它作为一种好的做法。
话虽如此,如果您仍然感兴趣,可以使用以下自定义 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);
}
}
【讨论】:
使用label 代替textbox。我认为您只想显示信息而不是选择,而不是复制,使用label 将是更好的选择...
【讨论】:
禁用它是一个选项吗? (启用 = 假)
【讨论】: