我需要显示一条可变长度的消息并允许选择文本。我已将 TextBox ReadOnly 设为不允许编辑文本,但仍显示输入插入符号。
闪烁的输入插入符号令人困惑。我该如何隐藏它?
您可以通过 win32 调用
[DllImport("user32.dll")]
static extern bool HideCaret(IntPtr hWnd);
public void HideCaret()
{
HideCaret(someTextBox.Handle);
}
使用 win32 调用时,不要忘记在文本框的 GotFocus 事件中隐藏光标。
为了完整起见,我需要这样的功能来与DevExpress WinFormsTextEdit
控件一起使用。
他们已经提供了一个ShowCaret
和一个HideCaret
方法,不幸的是他们受到了保护。因此,我创建了一个提供该功能的派生类。这是完整的代码:
public class MyTextEdit : TextEdit
{
private bool _wantHideCaret;
public void DoHideCaret()
{
HideCaret();
_wantHideCaret = true;
}
public void DoShowCaret()
{
ShowCaret();
_wantHideCaret = false;
}
protected override void OnGotFocus(EventArgs e)
{
base.OnGotFocus(e);
if (_wantHideCaret)
{
HideCaret();
}
}
}
要使用代码,只需在代码中使用派生类而不是原始TextEdit
类并在任何地方调用DoHideCaret()
,例如在包含文本编辑控件的表单的构造函数中。
也许这对将来的某人有帮助。
如果禁用文本框 (set Enable=false
),其中的文本仍然可以滚动和选择。如果您不喜欢禁用文本框(通常为灰色背景)的视觉呈现,您可以手动覆盖颜色。
请注意,手动覆盖颜色会使您的表单/控件在不使用默认颜色/主题设置的系统上看起来很奇怪。不要假设因为你的控制是白色的,所以每个人的控制都是白色的。这就是为什么您应该尽可能始终使用系统颜色(在System.Drawing.SystemColors
枚举中定义),例如SystemColors.ControlLight
.
我知道这是一个旧线程,但它是一个有用的参考。
我用一个更简单但非常复杂的解决方案解决了这个问题,这可能取决于您对用户对表单的访问权限的控制程度。我添加了一个文本框(任何可聚焦的控件),我给它提供了主要的 tabIndex 值,然后将其放置在表格之外,使其不可见。这在对话框上工作正常,因为用户无法调整大小。如果表单是可调整大小的,这可能不起作用。
正如我所说,一个杂物 - 但设置起来要容易得多。(顺便说一句,我发现 HideCaret 方法不起作用 - 但我没有努力追求它。)
AFAIK,这是不可能的。TextBox 控件是一个有趣的控件,因为它实际上有很多行为由于它接入操作系统的方式而无法修改。这就是为什么许多很酷的自定义文本框都是从头开始编写的。
恐怕您可能无法做您想做的事情:(