我有一个包含以下(重要)属性的文本框:
this.license.Multiline = true;
this.license.ReadOnly = true;
this.license.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
this.license.ShortcutsEnabled = false;
看起来像这样:
如何禁止用户突出显示此文本框中的文本(我不想完全禁用文本框)?
答案 0 :(得分:9)
附加到SelectionChanged
事件,并在事件集e.Handled = true;
和SelectionLength = 0;
内,这将阻止选择发生。这类似于保持按键发生所需的内容。
答案 1 :(得分:4)
如果您将文字放入标签,然后将标签放入System.Widnows.Forms.Panel
控件中且AutoScroll
已打开,则可以显示无法选择的文字。
答案 2 :(得分:4)
要在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);
}
}
答案 3 :(得分:0)
您可以使用已禁用的RichTextBox
,然后将颜色重置为黑色。
RichTextBox rtb = new RichTextBox();
rtb.IsEnabled = false;
rtb.Text = "something";
rtb.SelectAll();
rtb.SelectionColor = Color.Black;
rtb.SelectedText = String.Empty;
答案 4 :(得分:0)
如果您使用的是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;
答案 5 :(得分:0)
由于标准TextBox不具有SelectionChanged事件,所以这是我想出的。
private void TextBox1_MouseMove(object sender, MouseEventArgs e)
{
TextBox1.SelectionLength = 0;
}
答案 6 :(得分:0)
我遇到了同样的问题,因此遇到了这个问题。我以某种方式解决了以下问题,
if (sender != null)
{
e.Handled = true;
if((sender as TextBox).SelectionLength != 0)
(sender as TextBox).SelectionLength = 0;
}
验证长度是否更改为0,然后仅将其设置为0,即可解决递归循环。
答案 7 :(得分:0)
非常简单的解决方案
找到标签,然后在文本框中转到mousedown事件,然后 将焦点设置为标签
这在VB中,可以轻松转换为C#
Private Sub RichTextBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles RichTextBox1.MouseDown
Label1.Focus()
End Sub
答案 8 :(得分:-1)
在WinForms中,正确的方法是分配事件MouseMove并将SelectionLength设置为0.
我在这里尝试并且完美无缺。
答案 9 :(得分:-1)
private void textBox5_Click(object sender, EventArgs e)
{
this.textBox5.SelectionStart = this.textBox5.Text.Length;
}