我正在将C#/。NET用于Windows窗体应用程序。我有一个文本框。如何使文本框不可选择?
我不想禁用整个文本框。
在文本框的'Enter'事件中,将ActiveControl设置为其他内容:
private void txtMyTextbox_Enter(object sender, EventArgs e)
{
ActiveControl = objMyOtherControl;
}
IsHitTestVisible="False"
可防止在鼠标悬停或单击时文本框显示边界框。就我而言,这足以利用文本框的文本包装功能,同时使其对用户操作不敏感
您有两个选择:
Label
控件。textBox.Enabled = false
以防止选择(请参阅here)。我有同样的问题。我有一个对话框,需要显示多行文本。由于多行和自动换行,我不能使用标签,因为它必须是文本框。
我首先将其设为只读,但是如果对话框被其他窗口刷新,则该文本将被选中,这看起来很可怕。所以我找到了问题。
在表单构建器程序中(无论其名为什么),都有一个名为TabStop的TextBox属性。我将其设置为false,并选择了只读文本框文本never。问题已解决。
导致文本的消息可以被拦截和阻止。我本以为EM_SETSEL
就足够了。但是,即使单击并拖动鼠标,也不会出现EM_SETEL
消息,但仍会选择文本。可能其中一条消息指向包含该信息的结构的指针。
注意:我不确定这是否会阻止所有选择文本的方法。
public class TextBox2 : TextBox {
private const int EM_SETSEL = 0x00B1;
private const int WM_LBUTTONDBLCLK = 0x203;
private const int WM_MOUSEMOVE = 0x200;
private const int WM_KEYDOWN = 0x100;
private const int VK_CONTROL = 0x11;
private const int VK_SHIFT = 0x10;
public TextBox2() {
this.ShortcutsEnabled = false; // disabled right click menu
this.Cursor = Cursors.Default;
}
protected override void OnGotFocus(EventArgs e) {
base.OnGotFocus(e);
HideCaret(this.Handle); // doesn't work from OnHandleCreated
}
[DllImport("user32.dll")]
public static extern bool HideCaret(IntPtr hWnd);
public override bool PreProcessMessage(ref Message msg) {
// prevents the user from using the SHIFT or CTRL + arrow keys to select text
if (msg.Msg == WM_KEYDOWN)
return true;
return base.PreProcessMessage(ref msg);
}
protected override void WndProc(ref Message m) {
if (m.Msg == EM_SETSEL || m.Msg == WM_MOUSEMOVE || m.Msg == WM_LBUTTONDBLCLK)
return;
base.WndProc(ref m);
}
}
可能最好的方法是在其后放置标签,并且要禁用文本框时,将其隐藏并在其位置显示标签。
旧问题,我对解决这个问题的答案并不满意,但是如果最初的意图是使用文本框显示数据而不允许以任何方式选择它,这是一种方法(到目前为止)对我有用。
首先,我的文本框的非默认属性:
Multiline = true
ReadOnly = true
ScrollBars = Both
ShortcutsEnabled = false
TabStop = false
WordWrap = false
然后进行鼠标事件处理。 MouseMove和DoubleClick都被映射为触发textBox1_MouseGeneral()
,并且在Click事件中发生了其他操作,因此这两个事件处理程序明显重复。
private void MouseEvent()
{
textBox1.SelectionLength = 0;
focusControl.Focus(); // Move focus to another control
}
private void textBox1_Click(object sender, EventArgs e)
{
MouseEvent();
}
private void textBox1_MouseGeneral(object sender, EventArgs e)
{
MouseEvent();
}
出现闪烁的插入符号光标,然后textBox1失去焦点。
private void textBox1_Click(object sender, EventArgs e)
{
this.textBox1.SelectionStart = this.textBox1.Text.Length;
}
并且不要忘记:只读= true
尝试使用CanFocus属性。
@@ Mystere Man:您可能想要一个无法一直使用的文本框。例如,我允许用户在画布上创建文本框并将其拖动。为了防止他们在拖动时选择和移动文本,我需要禁止用户输入,并且还必须禁用文本选择,因为这会导致延迟,使我的拖动功能混乱。在我的应用程序中,用户只有在双击文本框后才能对其进行编辑,然后必须在该文本框之外单击才能再次移动它。
我基本上有此代码(其中t是TextBox):
// Prevent text entry
t.IsReadOnly = true;
// Prevent text selection
t.Focusable = false;
此行为比禁用整个控件(t.Enabled = false
)更可取,因为这还将停止mousedown和doubleclick事件,这将停止拖动并从编辑模式更改为拖动模式。更不用说文本框会变成灰色。
这对我来说很好:
textBox.ReadOnly = true