我试图强制用户在文本框中输入大写字母作为第一个字符输入。不知道为什么这不起作用。
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();
}
}
}
答案 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);
}
}