1

在用户单击控件和/或将自己的文本写入字段之前,重新创建文本框显示特定字符​​串(斜体和不同字体)的效果的最简单方法是什么?例如,查看 SO 右上角的“搜索”框。

我尝试过使用 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,直到我给出另一个控制焦点。

那么,这种方法是不是最好的,如果是,那么正确的第二个条件是什么,而不是 .Focused?

4

3 回答 3

1

尝试TextEdit.Properties.NullValuePrompt属性。此属性提供当编辑器没有焦点时显示为灰色的文本,并且其编辑值未设置为有效值。

于 2012-06-29T10:26:09.720 回答
0

首先,你不应该使用paint事件,如果你想通过修改text属性来做,你应该使用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 函数有很多重载,所以你可以选择你想要的。

于 2012-06-28T17:22:47.193 回答
0

您可以使用 Enter 事件。例如,将Text属性设置为“搜索”。像其他人报告的那样使用你的字体。然后捕获 Enter 事件并将Text属性设置为string.empty.

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

但我认为最好的做法是NullValuePrompt.

于 2012-07-10T06:47:34.010 回答