WPF 文本框不允许使用符号
本文关键字:符号 不允许 文本 WPF | 更新日期: 2023-09-27 18:31:05
我创建了一个 WPF 文本框,并为该文本框生成了一个 KeyDown 事件,以仅允许字母数字、空格、退格、'-' 来实现我使用以下代码
private void txtCompanyName_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
e.Handled = !(char.IsLetterOrDigit((char)KeyInterop.VirtualKeyFromKey(e.Key)) || (char)KeyInterop.VirtualKeyFromKey(e.Key) == (char)Keys.Back || (char)KeyInterop.VirtualKeyFromKey(e.Key) == (char)Keys.Space || (char)KeyInterop.VirtualKeyFromKey(e.Key) == '-');
}
但它也允许文本框中的符号。 我该如何解决这个问题。对不起,我的英语不好。 提前致谢
使用PreviewKeyDown
事件而不是KeyDown
事件。如果处理,它将不允许触发键控事件。为了实现完整的功能,您还应该为textBox.PreviewTextInput
放置相同的逻辑
我同意@nit,但补充说你也可以使用以下:
textBox.PreviewTextInput = new TextCompositionEventHandler((s, e) => e.Handled =
!e.Text.All(c => Char.IsNumber(c) && c != ' '));
或者,创建了一个可在整个应用程序中重用的附加行为:)
例:
用法:
<TextBox x:Name="textBox" VerticalContentAlignment="Center" FontSize="{TemplateBinding FontSize}" attachedBehaviors:TextBoxBehaviors.AlphaNumericOnly="True" Text="{Binding someProp}">
法典:
public static class TextBoxBehaviors
{
public static readonly DependencyProperty AlphaNumericOnlyProperty = DependencyProperty.RegisterAttached(
"AlphaNumericOnly", typeof(bool), typeof(TextBoxBehaviors), new UIPropertyMetadata(false, OnAlphaNumericOnlyChanged));
static void OnAlphaNumericOnlyChanged(DependencyObject depObj, DependencyPropertyChangedEventArgs e)
{
var tBox = (TextBox)depObj;
if ((bool)e.NewValue)
{
tBox.PreviewTextInput += tBox_PreviewTextInput;
}
else
{
tBox.PreviewTextInput -= tBox_PreviewTextInput;
}
}
static void tBox_PreviewTextInput(object sender, System.Windows.Input.TextCompositionEventArgs e)
{
// Filter out non-alphanumeric text input
foreach (char c in e.Text)
{
if (AlphaNumericPattern.IsMatch(c.ToString(CultureInfo.InvariantCulture)))
{
e.Handled = true;
break;
}
}
}
}
您可以检查是否启用了capslock或按下了其中一个shift键(例如 Keyboard.IsKeyDown(Key.LeftShift);
),如果是这种情况,您只需留出空间并返回:
if (condition)
e.Handled = e.Key == Key.Back || e.Key == Key.Space;
此外,我建议您使用 TextChanged-事件,因为如果您在TextBox
中粘贴某些内容,它也会被触发。