您如何分配ToolTip
并将TextBox
所有“谈论文本框的用途”放在其中?
ToolTip
只需在表单内拖放即可。然后在每个TextBox
属性中,您应该在“杂项”部分中添加额外的条目ToolTip
(toolTip1
或者如果您重命名它,它的名称将是什么)。
然后,当用户将鼠标悬停在TextBox
(只读/禁用TextBox
似乎不显示工具提示)并停在那里 1 秒时,工具提示应该显示正确的信息。
您最终甚至可以更好地Label
说明TextBox
“是什么”,但是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。