您如何将ToolTip 分配给TextBox 并将所有“谈论文本框的用途”放在其中?
只需将ToolTip 拖放到表单中即可。然后在每个TextBox 属性中,您应该在toolTip1 上的Misc 部分ToolTip 中有额外的条目(或者如果您重命名它,它的名称将是任何名称)。
然后,当用户将鼠标悬停在 TextBox(只读/禁用 TextBox 似乎不显示工具提示)并停在那里 1 秒钟时,工具提示应该显示正确的信息。
您最终甚至可以在 TextBox 旁边添加一个 Label 来说明是什么,但拥有一个 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);
}
}
在您的表单中,您可以这样激活它:
textBoxYourWhatever.SetWatermark("Text that should display");
只要TextBox 为空,它就会一直存在。当用户进入TextBox 时,文本消失。当TextBox 被清理(由用户或自动)时,它会再次出现。不需要任何特殊活动等。
编辑:
我还添加了内部类 WaterMarkTextBox,它使您可以选择简单地使用在 Designer 中可用的新 WaterMarkTexBox。然后将其拖放到您的设计师并使用它。它的行为与普通文本框一样,只是为您提供了额外的 WaterMarkText 字段。
我还是更喜欢你的第一种方法。不会让你再次重建你的 gui。