我有一个具有以下(重要)属性的文本框:
this.license.Multiline = true;
this.license.ReadOnly = true;
this.license.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
this.license.ShortcutsEnabled = false;
它看起来像这样:
如何禁用用户突出显示此文本框中的文本(我不想完全禁用文本框)?
附加到SelectionChanged
事件,并在事件集内e.Handled = true;
,SelectionLength = 0;
并且将阻止选择发生。这类似于防止按键发生所需的操作。
要禁用 中的选择突出显示TextBox
,您可以覆盖WndProc
和处理WM_SETFOCUS
消息并将其替换为WM_KILLFOCUS
. 请注意,它不会将TextBox
控件设为只读,如果您需要将其设为只读,还应将ReadOnly
属性设置为true
. 如果您设置ReadOnly
为 true,您可以将其设置BackColor
为White
或您想要的任何其他合适的颜色。
在下面的代码中,我添加了一个SelectionHighlightEnabled
属性来MyTextBox
使启用或禁用选择突出显示变得容易:
SelectionHighlightEnabled
:获取或设置一个值,指示是否启用选择突出显示。默认情况下,该值的true
行为类似于正常的TextBox
. 如果将其设置为,false
则不会呈现选择突出显示。using System.ComponentModel;
using System.Windows.Forms;
public class MyTextBox : TextBox
{
public MyTextBox()
{
SelectionHighlightEnabled = true;
}
const int WM_SETFOCUS = 0x0007;
const int WM_KILLFOCUS = 0x0008;
[DefaultValue(true)]
public bool SelectionHighlightEnabled { get; set; }
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_SETFOCUS && !SelectionHighlightEnabled)
m.Msg = WM_KILLFOCUS;
base.WndProc(ref m);
}
}
如果您将文本放入标签中,然后将标签放入System.Widnows.Forms.Panel
已AutoScroll
打开的控件中,则可以显示文本而不选择它。
我遇到了这个线程,因为我遇到了同样的问题。我以某种方式解决了它,如下所示,
if (sender != null)
{
e.Handled = true;
if((sender as TextBox).SelectionLength != 0)
(sender as TextBox).SelectionLength = 0;
}
验证长度是否更改为 0 以外的值,然后仅将其设置为 0,即可解决递归循环。
由于标准 TextBox 没有 SelectionChanged 事件,这就是我想出的。
private void TextBox1_MouseMove(object sender, MouseEventArgs e)
{
TextBox1.SelectionLength = 0;
}
非常简单的解决方案
找到一个标签并进入文本框去 mousedown 事件并将焦点设置到标签
这是在VB中,可以很容易地转换成C#
Private Sub RichTextBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles RichTextBox1.MouseDown
Label1.Focus()
End Sub
如果您使用的是 XAML / WPF,则应使用TextBlock而不是TextBox。
仅当您使用文本框作为显示而不是用于输入 时 - 因为 TextBlock 使文本看起来好像是“雕刻”到表单本身,而不是在文本框中。要获得 TextBlock 周围的边框(如果您愿意),您可以这样做:
在XAML中,例如:
<Border BorderThickness="1" BorderBrush="Gray">
<TextBlock Background="White" Text="Your Own TextBlock"/>
</Border>
或者在C# 代码中动态地:
//Create a Border object
Border border = new Border();
border.BorderThickness = new Thickness(1);
border.BorderBrush = Brushes.Black;
//Create the TextBlock object
TextBlock tb = new TextBlock();
tb.Background = Brushes.White;
tb.Text = "Your Own TextBlock";
//Make the text block a child to the border
border.Child = tb;
您可以使用禁用RichTextBox
并在之后将颜色重置为黑色。
RichTextBox rtb = new RichTextBox();
rtb.IsEnabled = false;
rtb.Text = "something";
rtb.SelectAll();
rtb.SelectionColor = Color.Black;
rtb.SelectedText = String.Empty;
在 WinForms 中,正确的方法是分配事件 MouseMove 并将 SelectionLength 设置为 0。
我在这里尝试过并且效果很好。
private void textBox5_Click(object sender, EventArgs e)
{
this.textBox5.SelectionStart = this.textBox5.Text.Length;
}