Как насчет того, чтобы назначить 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
очищается (пользователем или автоматически). Нет необходимости в каких-либо специальных мероприятиях и т. Д.
EDIT:
Я также добавил внутренний класс WaterMarkTextBox, который дает вам возможность просто использовать новый WaterMarkTexBox, который становится доступным в Designer. Затем перетащите его в свой дизайнер и используйте его. Он ведет себя как обычное текстовое поле, просто дает вам дополнительное поле WaterMarkText.
Я все еще предпочитаю первый метод, ты. Не заставляет вас снова восстанавливать графический интерфейс.