c# - WPF 自定义文本框使用 Regex 控制用户输入

标签 c# regex wpf-controls prism-5

我的目标是编写/扩展一个可以通过输入一些无效字符来限制用户的 WPF 文本框。所以允许的字符将是一个正则表达式。

这是我做的:

 public class MyTextBox : TextBox
{
    static MyTextBox()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(MyTextBox),
         new FrameworkPropertyMetadata(typeof(MyTextBox)));
        TextProperty.OverrideMetadata(typeof(MyTextBox), new FrameworkPropertyMetadata(new PropertyChangedCallback(TextPropertyChanged)));

    }

    public MyTextBox()
    {
       PreviewTextInput +=MyTextBox_PreviewTextInput;
    }
    void MyTextBox_PreviewTextInput(object sender, System.Windows.Input.TextCompositionEventArgs e)
    {
        var tb = sender as MyTextBox;
        if (tb == null) return;

        if (IsMasking(tb) && !Regex.IsMatch(e.Text, Mask))
        {
            e.Handled = true;
        }
    }

   private static bool IsMasking(MyTextBox tb)
    {
        if (string.IsNullOrWhiteSpace(tb.Mask)) return false;
        try
        {
            new Regex(tb.Mask);
        }
        catch (Exception)
        {
                           return false;
        }
        return true;
    }

    #region Mask Dependancy property
    public string Mask
    {
        get { return (string)GetValue(MaskProperty); }
        set { SetValue(MaskProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Mask.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty MaskProperty =
        DependencyProperty.Register("Mask", typeof(string), typeof(MyTextBox), new PropertyMetadata(string.Empty));

    #endregion


}

用法:

 <ctrlLib:MyTextBox  Watermark="Test WM" Width="350" Margin="20" 
                        Mask="^[A-Z][0-9]{2}$"
                        PreviewTextInput="UIElement_OnPreviewTextInput"/>

所以我只想允许 alpha 后跟两个整数。我的控件甚至不接受任何字符作为输入

我做错了什么或如何解决? 我想因为正则表达式是针对整个字符串的,所以输入单个字符并不能解决问题??

最佳答案

这应该可以解决问题

^[A-Za-z]*\d\d$

你已经很接近了,你只需要在 [A-Z] 之后开始

我让它不区分大小写并使用\d 作为 [0-9] 的简写

关于c# - WPF 自定义文本框使用 Regex 控制用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34514070/

相关文章:

regex - 使用 sed 查找和替换一系列数字

c# - 从 .Net 将简单数据插入 Excel 文件的最简单方法

c# - Arduino 安全地使用 .net Core api?

c# - 由 Azure 代理执行时 CopyFromScreen 方法永远不会完成

.net - 是否有WPF控件可让您连接到SQLSERVER数据库?

c# - 如何自动滚动 ScrollViewer - 仅当用户未更改滚动位置时

c# - TextBox 不支持系统十进制(点或逗号)

如果第二次启动,C# 程序只能运行一次 + BringToFront

javascript - 在文本字符串中查找与 Twitter 使用完全相同的任何 URL

javascript - Javascript 的正则表达式后视解决方法?