当用户输入文本框时,为什么不能将文本框的第一个字母大写?

时间:2017-04-14 23:15:08

标签: c# wpf

我试图强制用户在文本框中输入大写字母作为第一个字符输入。不知道为什么这不起作用。

    private void txtStart_TextChanged(object sender, TextChangedEventArgs e) {
        char[] letters = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
        string key = txtStart.Text;
        foreach (char letter in letters) {
            if (key[0] == letter) {
                key = key.ToUpper();
            }
        }
    }

3 个答案:

答案 0 :(得分:2)

实际上,您将整个文本设置为upercase ,而不是将textBox的属性设置为新值。将旧文本保存在私有属性中也是一个好主意。试试这个:

private string _oldText = "";
private void txtStart_TextChanged(object sender, TextChangedEventArgs e) 
{
    if ((txtStart.SelectionStart <= txtStart.Length - _oldText.Length || txtStart.SelectionStart == 0) && char.IsLower(txtStart.Text.FirstOrDefault()))
    {
        var selectionStart = txtStart.SelectionStart;
        var selectionLength = txtStart.SelectionLength;
        txtStart.TextChanged -= txtStart_TextChanged;
        txtStart.Text = $"{Char.ToUpper(txtStart.Text.First())}{(txtStart.Text.Length > 1 ? txtStart.Text.Substring(1) : "")}";
        txtStart.Select(selectionStart, selectionLength);
        txtStart.TextChanged += txtStart_TextChanged;
    }
    _oldText = txtStart.Text;
}

实际上我做了一个稍微好一点的检查,第一个字母是小写的,你可能会意识到我也将cursorPosition设置到前一个位置,我暂时删除了事件处理程序,以防止在事件处理中陷入无限循环

答案 1 :(得分:0)

试试这个。

private void txtStart_TextChanged(object sender, TextChangedEventArgs e) 
{
    string str = txtStart.Text;

    if (str == "")
        return;

    if (str.Length > 1)
        str = char.ToUpper(str[0]) + str.Substring(1);
    else
        str = str.ToUpper();

    txtStart.Text = str;
}

答案 2 :(得分:0)

一种可靠的方法是使用一个类级变量来跟踪代码是否正在更改文本,或者用户是否正在更改文本。这样,当您的代码重置文本时,您基本上忽略了TextChanged代码。

我还将一个类变量设置为文本框中的最后一个选择开始位置。这处理用户将文本粘贴到文本框中的情况,这可能会将选择重置为文本的开头。

所以这个方法应该处理粘贴文本,或者对第一个字符进行退格(这仍然很烦人,因为它会立即将下一个字符大写,这很可能不是用户想要的那样)。

以下是它的工作原理:

private bool codeIsChangingText = false;
private int selectionStart;

private void txtStart_TextChanged(object sender, EventArgs e)
{
    if (codeIsChangingText)
    {
        codeIsChangingText = false;
        txtStart.SelectionStart = selectionStart;
    }
    else if (char.IsLower(txtStart.Text.FirstOrDefault()))
    {
        codeIsChangingText = true;
        selectionStart = txtStart.SelectionStart;
        txtStart.Text = char.ToUpper(txtStart.Text.First()) + txtStart.Text.Substring(1);
    }
}