@DennisTraubの作品ですが、省略されているコーナーケースがいくつかあります。たとえば、テキストボックス内のテキストが「-11」で、ユーザーがテキストの先頭にカーソルを置いている場合、テキストが「1-11」または「.-」になるように、別の文字を入力できます。 11"。これは私のために働くように思われる彼の答えの拡張です。
TextBox textBox = sender as TextBox;
// If the text already contains a negative sign, we need to make sure that
// the user is not trying to enter a character at the start
// If there is already a negative sign and the negative sign is not selected, the key press is not valid
// This allows the user to highlight some of the text and replace it with a negative sign
if ((textBox.Text.IndexOf('-') > -1) && textBox.SelectionStart == 0 && !textBox.SelectedText.Contains('-'))
{
e.Handled = true;
}
// Do not accept a character that is not included in the following
if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && e.KeyChar != '.' && e.KeyChar != '-')
{
e.Handled = true;
}
// Only allow one decimal point
if ((e.KeyChar == '.') && (textBox.Text.IndexOf('.') > -1))
{
e.Handled = true;
}
// The negative sign can only be at the start
if ((e.KeyChar == '-'))
{
// If the cursor is not at the start of the text, the key press is not valid
if (textBox.SelectionStart > 0)
{
e.Handled = true;
}
// If there is already a negative sign and the negative sign is not selected, the key press is not valid
// This allows the user to highlight some of the text and replace it with a negative sign
if (textBox.Text.IndexOf('-') > -1 && !textBox.SelectedText.Contains('-'))
{
e.Handled = true;
}
}
私は1行にまとめることができるいくつかのものを分解しました。ただし、基本的には、テキストにすでに負の符号が含まれているかどうか、およびユーザーがテキストの先頭にカーソルを持っているかどうかも確認する必要があります。