zoukankan      html  css  js  c++  java
  • 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;
                }
            }
        }
    }
    
    • 运行效果
  • 相关阅读:
    洛谷P1368 均分纸牌(加强版) [2017年6月计划 数论14]
    洛谷P1621 集合 [2017年6月计划 数论13]
    NOIP模拟 6.30
    洛谷P1390 公约数的和 [2017年6月计划 数论12]
    洛谷P1573 栈的操作 [2017年6月计划 数论11]
    洛谷P2429 制杖题 [2017年6月计划 数论10]
    Vijos1212 Way Selection [2017年6月计划 二分图03]
    NOIP模拟赛 6.29
    RQNOJ PID192 梦幻大PK [2017年6月计划 二分图02]
    RQNOJ PID141 / 寻找代表元 [2017年6月计划 二分图01]
  • 原文地址:https://www.cnblogs.com/bigbosscyb/p/14105013.html
Copyright © 2011-2022 走看看