2012-06-28 4 views
1

Каков самый простой способ воссоздать эффект, когда текстовое поле отображает определенную строку (курсивом и другим шрифтом), пока пользователь не щелкнет в элементе управления и/или не напишет свой собственный текст в поле? Например, посмотрите на поле поиска в верхнем правом углу SO.Как отобразить текст по умолчанию в EditControls?

Я попытался потребляя событие Paint:

private void textEdit1_Paint(object sender, PaintEventArgs e) 
    { 
     if (textEdit1.Text.Length == 0 && !textEdit1.Focused) 
     { 
      textEdit1.Font = new Font(textEdit1.Font, FontStyle.Italic); 
      textEdit1.Text = "123"; 

     } 
     else 
     { 
      textEdit1.Font = new Font(textEdit1.Font, FontStyle.Regular); 
      textEdit1.Text = string.Empty; 
     } 
    } 

Однако, это не работает. По умолчанию он не отображает текст, и если я нажимаю на него, я, кажется, получаю бесконечный цикл установки текста на «123» и string.empty, пока я не дам еще один фокус управления.

Итак, это тот подход даже к лучшему, и если да, то какое правильное второе условие вместо .фокусировано?

+0

Нет ли свойства «NullText», которое вы можете использовать? – Willem

+0

@Willem Да, есть, но он использует тот же шрифт, что и обычный текст, поэтому это не тот взгляд, который я собираюсь сделать. – Hackworth

ответ

0

Прежде всего, вы не должны использовать событие paint, вы должны использовать событие FocusChanged, если хотите сделать это, изменив свойство text. Однако самый простой способ, чтобы не изменить свойства текста, но нарисовать строку сверху, как это:

private void textEdit1_Paint(object sender, PaintEventArgs e) 
{ 
    if (textEdit1.Text.Length == 0 && !textEdit1.Focused) 
    { 
     Font some_font = new Font(...parameters go here...); 
     Brush some_brush = Brushes.Gray; // Or whatever color you want 
     PointF some_location = new PointF(5,5); // Where to write the string 
     e.Graphics.WriteString("some text", some_font, some_brush, some_location); 
    } 
} 

Так что, если нет текста, а также текстовое поле не сфокусирован, сделать эту строку. Существует много перегрузок функции WriteString, поэтому вы можете выбрать, какой из них вы хотите.

1

Пробуйте TextEdit.Properties.NullValuePrompt Недвижимость. Это свойство предоставляет текст, отображаемый серым цветом, когда редактор не имеет фокуса, а его значение редактирования не установлено в допустимое значение.

0

Вы можете использовать событие Enter. Задайте Text свойство "искать", например. Используйте свой шрифт, как и другие. Затем перехватите событие Enter и установите для свойства Text значение string.empty.

textedit1.Text = "search"; 
private void textEdit1_Enter(object sender, EnterEventArgs e) 
{ 
    textedit1.text = string.empty; 
} 

Но я считаю, что наилучшей практикой является NullValuePrompt.

Смежные вопросы