Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 禁用在文本框中选择文本_C#_.net_Winforms_Textbox - Fatal编程技术网

C# 禁用在文本框中选择文本

C# 禁用在文本框中选择文本,c#,.net,winforms,textbox,C#,.net,Winforms,Textbox,我有一个具有以下(重要)属性的文本框: this.license.Multiline = true; this.license.ReadOnly = true; this.license.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; this.license.ShortcutsEnabled = false; 看起来是这样的: 如何禁用用户突出显示此文本框中的文本(我不想完全禁用文本框)?附加到SelectionChanged事

我有一个具有以下(重要)属性的文本框:

this.license.Multiline = true;
this.license.ReadOnly = true;
this.license.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
this.license.ShortcutsEnabled = false;
看起来是这样的:


如何禁用用户突出显示此文本框中的文本(我不想完全禁用文本框)?

附加到
SelectionChanged
事件,并在事件集中
e.Handled=true
选择长度=0将阻止选择发生。这与防止按键类似。

如果将文本放入标签,然后将标签放入启用了
自动滚动的
控件的
系统.Widnows.Forms.Panel
中,则可以在不选择文本的情况下显示文本。

在WinForms中,正确的方法是分配事件MouseMove并将SelectionLength设置为0


我在这里尝试过,效果很好。

您可以使用禁用的
RichTextBox
然后将颜色重置为黑色

private void textBox5_Click(object sender, EventArgs e)
{
    this.textBox5.SelectionStart = this.textBox5.Text.Length;
}
RichTextBox rtb = new RichTextBox();
rtb.IsEnabled = false;
rtb.Text = "something";
rtb.SelectAll();
rtb.SelectionColor = Color.Black;
rtb.SelectedText = String.Empty;

要禁用
文本框中的选择突出显示
,您可以覆盖
WndProc
,处理消息并将其替换为。请注意,它不会将
文本框
控件设置为只读,如果需要将其设置为只读,还应将
只读
属性设置为
。如果将
ReadOnly
设置为true,则可以将其
背景色
设置为
白色
或任何其他合适的颜色

在下面的代码中,我在
MyTextBox
中添加了一个
selectionHighlightabled
属性,使启用或禁用选择高亮显示变得简单:

  • selectionHighlightabled
    :获取或设置一个值,该值指示是否启用了选择突出显示。默认情况下,该值为
    true
    ,与正常的
    文本框类似。如果将其设置为
    false
    ,则不会呈现选择突出显示

如果您使用的是XAML/WPF,则应使用文本块而不是文本框

仅当您将文本框用作显示而非输入时 -因为TextBlock使文本看起来像是“刻”在表单本身上,而不是在文本框中。要获得文本块周围的边框(如果愿意),可以执行以下操作之一:

在XAML中,例如:

<Border BorderThickness="1" BorderBrush="Gray">
    <TextBlock Background="White" Text="Your Own TextBlock"/>
</Border>

因为标准文本框没有SelectionChanged事件,所以我想到了以下内容

private void TextBox1_MouseMove(object sender, MouseEventArgs e)
{
    TextBox1.SelectionLength = 0;
}

我遇到这个问题是因为我面临同样的问题。不知何故,我决定如下:

if (sender != null)
                {
                    e.Handled = true;
                    if((sender as TextBox).SelectionLength != 0)
                        (sender as TextBox).SelectionLength = 0;
                }
验证长度是否更改为0以外的值,然后仅将其设置为0,即可解决递归循环。

非常简单的解决方案

找到标签并进入文本框,转到mousedown事件并 将焦点设置为标签

这是在VB中,可以很容易地转换成C#


它会有一个垂直的屏幕吗?WinForms?WPF?这是什么类型的
RichTextBox
?@BigM
this.license.ScrollBars=System.Windows.Forms.ScrollBars.Vertical-必须是WinForms我找不到WinForms TextBox控件的此类事件。@checho如果您感兴趣,我遇到了与您相同的问题,但通过使用WinForms RichTextBox控件解决了它,谢天谢地,它确实改变了
SelectionChanged
事件。使用文本框执行此操作会导致递归循环和StackOverflowException。在SelectionChanged回调中更改选择是个坏主意@Floydhold您可以在Selectional之前注销hander,然后在Selectional之后再次注册,以防止StackOverflowException。这不是一个正确的解决方案。你仍然可以通过点击来选择文本。这是一个更好的解决方案。没有使文本框正常工作的方法。@pitersmx
private void TextBox1_MouseMove(object sender, MouseEventArgs e)
{
    TextBox1.SelectionLength = 0;
}
if (sender != null)
                {
                    e.Handled = true;
                    if((sender as TextBox).SelectionLength != 0)
                        (sender as TextBox).SelectionLength = 0;
                }
Private Sub RichTextBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles RichTextBox1.MouseDown
        Label1.Focus()
    End Sub