C # .net WinForms, как заставить текст в текстовом поле исчезать, когда текстовое поле находится в фокусе? - PullRequest
1 голос
/ 04 декабря 2011

Есть ли способ, которым я мог бы создать светло-серый текст, который исчезает, когда текстовое поле находится в фокусе?

В настоящее время у меня есть текст, написанный в текстовом поле, но я должен выделить текст и удалить его вручную (несколько раздражает ...)

Я знаю, что могу что-то сделать, когда сфокусируюсь на блоке (используя события), однако, я не хочу, чтобы он очищал текст каждый раз, когда пользователь выбирает этот блок ... скорее только в первый раз. Другими словами, я просто хочу, чтобы текст подсказки исчезал (а не текст, который они вводят, если они должны были выбрать поле после однократного ввода) ...

Я также понимаю, что могу использовать что-то вроде счетчика, чтобы отследить, если в первый раз щелкается окно ... однако я искал более чистый способ сделать это .....

Ответы [ 2 ]

3 голосов
/ 04 декабря 2011

Что-то вроде кода ниже. Обратите внимание, что это не скомпилированный код. Просто поделитесь идеей, плюс вы можете сохранить настройки по умолчанию, если пользователь не вводил текст. Для этого обработайте потерянный фокус и верните значение по умолчанию.

   public class FancyTextBox : TextBox{

private bool _isDefaultText;
public FancyTextBox(){
     UpdateDefaultSettings(true);         
}

protected override void OnGotFocus(EventArgs e)
{
    base.OnGotFocus(e);
    UpdateDefaultSettings(false);
}

protected override void OnLostFocus(EventArgs e)
{
    base.OnLostFocus(e);
    if (String.IsNullOrEmpty(Text))
    {
        //Retain Default Setting.
        UpdateDefaultSettings(true);
    }
}

private void UpdateDefaultSettings(bool isDefault){
    _isDefaultText = isDefault;
    if(_isDefaultText){
       Text = "Please enter";
       this.ForeColor= Color.Gray;  
    }
    else{
       Text = "";
       ForeColor = Color.Black;
    }
}    

}

2 голосов
/ 21 мая 2013

Более простой ответ:

[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 SetHint(TextBox textBox, string hintText)
{
 const uint EmSetCueBanner = 0x1501;
 SendMessage(textBox.Handle, EmSetCueBanner, 0, hintText);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...