8

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

this.license.Multiline = true;
this.license.ReadOnly = true;
this.license.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
this.license.ShortcutsEnabled = false;

它看起来像这样:

带有突出显示的文本的文本框

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

4

10 回答 10

13

附加到SelectionChanged事件,并在事件集内e.Handled = true;SelectionLength = 0;并且将阻止选择发生。这类似于防止按键发生所需的操作。

于 2012-11-06T18:13:17.573 回答
6

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

在下面的代码中,我添加了一个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);
    }
}
于 2017-02-22T12:22:13.947 回答
5

如果您将文本放入标签中,然后将标签放入System.Widnows.Forms.PanelAutoScroll打开的控件中,则可以显示文本而不选择它。

于 2012-11-06T18:13:18.277 回答
1

我遇到了这个线程,因为我遇到了同样的问题。我以某种方式解决了它,如下所示,

if (sender != null)
                {
                    e.Handled = true;
                    if((sender as TextBox).SelectionLength != 0)
                        (sender as TextBox).SelectionLength = 0;
                }

验证长度是否更改为 0 以外的值,然后仅将其设置为 0,即可解决递归循环。

于 2019-05-02T10:47:46.870 回答
1

由于标准 TextBox 没有 SelectionChanged 事件,这就是我想出的。

private void TextBox1_MouseMove(object sender, MouseEventArgs e)
{
    TextBox1.SelectionLength = 0;
}
于 2018-12-04T07:16:23.313 回答
0

非常简单的解决方案

找到一个标签并进入文本框去 mousedown 事件并将焦点设置到标签

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

Private Sub RichTextBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles RichTextBox1.MouseDown
        Label1.Focus()
    End Sub
于 2020-02-20T11:09:36.570 回答
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;
于 2017-07-06T18:15:08.357 回答
0

您可以使用禁用RichTextBox并在之后将颜色重置为黑色。

RichTextBox rtb = new RichTextBox();
rtb.IsEnabled = false;
rtb.Text = "something";
rtb.SelectAll();
rtb.SelectionColor = Color.Black;
rtb.SelectedText = String.Empty;
于 2016-08-26T15:41:12.690 回答
-1

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

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

于 2013-11-07T16:48:06.857 回答
-1
private void textBox5_Click(object sender, EventArgs e)
{
    this.textBox5.SelectionStart = this.textBox5.Text.Length;
}
于 2015-11-23T09:41:31.227 回答