• WPF:TextBox控件禁用中文输入


    需求:

    TextBox控件只允许输入数字或英文字母

    分析:

    1. 不允许中文输入:可以通过禁用输入法实现
    2. 只允许数字或英文字母输入:可以在PreviewTextInput事件中通过正则表达式匹配进而过滤掉非法输入
    3. 由于"空格"未被输入事件捕捉:可以在PreviewKeyDown事件中判断空格键
    4. 最后要考虑"粘贴":以上操作并不能过滤掉粘贴中文和非法字符,所以可以在TextChanged事件中进行处理

    实现:

    • XAML布局文件
    <Grid>
        <TextBox
            Width="200"
            FontSize="30"
            VerticalAlignment="Center"
            HorizontalAlignment="Center"
            InputMethod.IsInputMethodEnabled="False"
            PreviewKeyDown="TextBox_PreviewKeyDown"
            PreviewTextInput="TextBox_PreviewTextInput"
            TextChanged="TextBox_TextChanged"/>
    </Grid>
    
    • 对应事件处理方法
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }
    
        private void TextBox_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            // 按下空格键时,使输入中断
            if (e.Key == Key.Space)
            {
                e.Handled = true;
            }
        }
    
        private void TextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            // 匹配非英文字母和数字
            Regex regex = new Regex(@"[^a-z0-9A-Z]+");
            // 根据匹配结果 设置Handled属性 (true--表示事件已处理,输入中断)
            bool isMatch = regex.IsMatch(e.Text);
            e.Handled = isMatch;
        }
    
        private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
        {
            var textBox = sender as TextBox;
            TextChange[] changes = new TextChange[e.Changes.Count];
            e.Changes.CopyTo(changes, 0);
            // 引起Text改变的字符串的起点
            int offset = changes[0].Offset;
            // 引起Text改变的字符串的长度
            if (changes[0].AddedLength > 0)
            {
                Regex regex = new Regex(@"[^a-z0-9A-Z]+");
                bool isMatch = regex.IsMatch(textBox.Text);
                // 最新的Text中若含有非法字符
                if (isMatch)
                {
                    // 由于我们已经从键盘输入事件中屏蔽了非法字符;所以基本可以断定此非法输入是由于"粘贴"引起的
                    textBox.Text = textBox.Text.Remove(offset, changes[0].AddedLength);
                    // 控制光标位置,使其还能定位到变动前的位置
                    textBox.SelectionStart = offset;
                }
            }
        }
    }
    
    • 运行效果
  • 相关阅读:
    vscode常用插件列表
    使用docker构建supervisor全步骤
    docker删除虚悬镜像(临时镜像文件)
    消息队列的对比
    ECharts使用:this.dom.getContext is not a function
    curl命令行请求
    工作工具清单
    《SQL优化入门》讲座总结
    初始化git库并配置自动部署
    php代码进行跨域请求处理
  • 原文地址:https://www.cnblogs.com/bigbosscyb/p/14105013.html
Copyright © 2020-2023  润新知