如何在C#Winforms程序的文本框中突出显示文本?

Sla*_*ard 7 c# textbox highlight winforms

我有一个带有多个文本框的C#Winforms程序.我使用每个框的属性在其中放置文本,向用户解释其中的值.每当用户选择该框时,我希望文本突出显示.通过Tab键或鼠标单击.如果有一种方法可以显示文本框中除了它之外的某个值,我就不必这样做了.

我尝试了Textbox.select方法,但没有效果.与相同.

这是我的程序的屏幕截图.

我的代码:

    private void grapplingText1_MaskInputRejected(object sender, MaskInputRejectedEventArgs e)
    {
        grapplingText1.SelectionStart = 0;
        grapplingText1.SelectionLength = grapplingText1.Text.Length;
Run Code Online (Sandbox Code Playgroud)

这样做,还是更需要?

Mad*_*Boy 8

你怎么样分配ToolTipTextBox并把所有的"讲什么文本框是"里面是什么?

只需ToolTip在表单内拖放即可.然后在每个TextBox属性,你应该在其它部分中的附加项ToolTiptoolTip1(或者,如果你重新命名它不管它的名字会).

然后,当用户将鼠标悬停TextBox(只读/已禁用TextBox似乎不显示工具提示)并在那里停留1秒钟时,工具提示应显示正确的信息.

你最终或者甚至可以更好LabelTextBox说下一个是什么,但有一个ToolTip也是一个好主意,通过它向用户解释更多信息.

对于使用WaterMark做的事情,所以你不必通过设置事件,照顾SelectAll等来做很长的事情,你可以这样做.创建新的watermark.cs文件并将其替换为此代码.确保已更改名称空间以匹配程序命名空间.

#region
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

#endregion

namespace Watermark {
    public static class TextBoxWatermarkExtensionMethod {
        private const uint ECM_FIRST = 0x1500;
        private const uint EM_SETCUEBANNER = ECM_FIRST + 1;
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam);
        public static void SetWatermark(this TextBox textBox, string watermarkText) {
            SendMessage(textBox.Handle, EM_SETCUEBANNER, 0, watermarkText);
        }
    }
}
   internal class WatermarkTextBox : TextBox {
    private const uint ECM_FIRST = 0x1500;
    private const uint EM_SETCUEBANNER = ECM_FIRST + 1;
    private string watermarkText;
    public string WatermarkText {
        get { return watermarkText; }
        set {
            watermarkText = value;
            SetWatermark(watermarkText);
        }
    }
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam);
    private void SetWatermark(string watermarkText) {
        SendMessage(Handle, EM_SETCUEBANNER, 0, watermarkText);
    }
}
Run Code Online (Sandbox Code Playgroud)

在您的表单中,您可以像这样激活它:

textBoxYourWhatever.SetWatermark("Text that should display");
Run Code Online (Sandbox Code Playgroud)

只要它TextBox是空的,它就会停留在那里.当用户进入TextBox文本时消失.TextBox清洁时(用户或自动清洁)再次出现.不需要任何特殊活动等

编辑:

我还添加了内部类WaterMarkTextBox,它为您提供了一个选项,可以简单地使用Designer中可用的新WaterMarkTexBox.然后将其拖放到您的设计器并使用它.它的行为与普通文本框一样,只为您提供了额外的字段WaterMarkText.

我还是喜欢第一种方法.不会让你再次重建你的gui.


Jac*_*lor 7

我认为如果您知道要选择的文本数量,.select将起作用.

试试.SelectAll(); 它应该适合你