如何在WPF中验证剪贴板中的字符串

本文关键字:剪贴板 字符串 验证 WPF | 更新日期: 2023-09-27 18:11:10

在我的WPF文本框中,我已经在以下事件中验证了它

TextChangedPreviewTextInput

使用户不能允许特殊字符在其中,但用户可以通过ctrl+v键或鼠标右键粘贴特殊字符。

如何在文本框上验证这两个额外的事件

如何在WPF中验证剪贴板中的字符串

剪贴板服务支持PastingHandlers

      DataObject.AddPastingHandler(textBox, OnPaste);

在处理程序中取消处理无效数据....我想它有e.CancelCommand()呼叫

您可以使用DataObjectPastingEventArgs来编写粘贴事件,参考它来控制粘贴

private void OnPasting(object sender, DataObjectPastingEventArgs e) 
{     
var isText = e.SourceDataObject.GetDataPresent(System.Windows.DataFormats.Text, true);   
 if (!isText)
 return;   
   var text = e.SourceDataObject.GetData(DataFormats.Text) as string;    
} 

最好的方式就是这个问题的答案(所以把我之前的答案转换成评论,但那些不能被接受)

XAML:

 <TextBox b:Masking.Mask="someregularExpressionhere"/>  

背后代码:

   /// <summary>
    /// Provides masking behavior for any <see cref="TextBox"/>.
    /// </summary>
    public static class Masking
    {
            private static readonly DependencyPropertyKey _maskExpressionPropertyKey = DependencyProperty.RegisterAttachedReadOnly("MaskExpression",
                    typeof(Regex),
                    typeof(Masking),
                    new FrameworkPropertyMetadata());
            /// <summary>
            /// Identifies the <see cref="Mask"/> dependency property.
            /// </summary>
            public static readonly DependencyProperty MaskProperty = DependencyProperty.RegisterAttached("Mask",
                    typeof(string),
                    typeof(Masking),
                    new FrameworkPropertyMetadata(OnMaskChanged));
            /// <summary>
            /// Identifies the <see cref="MaskExpression"/> dependency property.
            /// </summary>
            public static readonly DependencyProperty MaskExpressionProperty = _maskExpressionPropertyKey.DependencyProperty;
            /// <summary>
            /// Gets the mask for a given <see cref="TextBox"/>.
            /// </summary>
            /// <param name="textBox">
            /// The <see cref="TextBox"/> whose mask is to be retrieved.
            /// </param>
            /// <returns>
            /// The mask, or <see langword="null"/> if no mask has been set.
            /// </returns>
            public static string GetMask(TextBox textBox)
            {
                    if (textBox == null)
                    {
                            throw new ArgumentNullException("textBox");
                    }
                    return textBox.GetValue(MaskProperty) as string;
            }
            /// <summary>
            /// Sets the mask for a given <see cref="TextBox"/>.
            /// </summary>
            /// <param name="textBox">
            /// The <see cref="TextBox"/> whose mask is to be set.
            /// </param>
            /// <param name="mask">
            /// The mask to set, or <see langword="null"/> to remove any existing mask from <paramref name="textBox"/>.
            /// </param>
            public static void SetMask(TextBox textBox, string mask)
            {
                    if (textBox == null)
                    {
                            throw new ArgumentNullException("textBox");
                    }
                    textBox.SetValue(MaskProperty, mask);
            }
            /// <summary>
            /// Gets the mask expression for the <see cref="TextBox"/>.
            /// </summary>
            /// <remarks>
            /// This method can be used to retrieve the actual <see cref="Regex"/> instance created as a result of setting the mask on a <see cref="TextBox"/>.
            /// </remarks>
            /// <param name="textBox">
            /// The <see cref="TextBox"/> whose mask expression is to be retrieved.
            /// </param>
            /// <returns>
            /// The mask expression as an instance of <see cref="Regex"/>, or <see langword="null"/> if no mask has been applied to <paramref name="textBox"/>.
            /// </returns>
            public static Regex GetMaskExpression(TextBox textBox)
            {
                    if (textBox == null)
                    {
                            throw new ArgumentNullException("textBox");
                    } 
                    return textBox.GetValue(MaskExpressionProperty) as Regex;
            }
            private static void SetMaskExpression(TextBox textBox, Regex regex)
            {
                    textBox.SetValue(_maskExpressionPropertyKey, regex);
            }
            private static void OnMaskChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
            {
                    var textBox = dependencyObject as TextBox;
                    var mask = e.NewValue as string;
                    textBox.PreviewTextInput -= textBox_PreviewTextInput;
                    textBox.PreviewKeyDown -= textBox_PreviewKeyDown;
                    DataObject.RemovePastingHandler(textBox, Pasting);
                    if (mask == null)
                    {
                            textBox.ClearValue(MaskProperty);
                            textBox.ClearValue(MaskExpressionProperty);
                    }
                    else
                    {
                            textBox.SetValue(MaskProperty, mask);
                            SetMaskExpression(textBox, new Regex(mask, RegexOptions.Compiled | RegexOptions.IgnorePatternWhitespace));
                            textBox.PreviewTextInput += textBox_PreviewTextInput;
                            textBox.PreviewKeyDown += textBox_PreviewKeyDown;
                            DataObject.AddPastingHandler(textBox, Pasting);
                    }
            }
            private static void textBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
            {
                    var textBox = sender as TextBox;
                    var maskExpression = GetMaskExpression(textBox);
                    if (maskExpression == null)
                    {
                            return;
                    }
                    var proposedText = GetProposedText(textBox, e.Text);
                    if (!maskExpression.IsMatch(proposedText))
                    {
                            e.Handled = true;
                    }
            }
            private static void textBox_PreviewKeyDown(object sender, KeyEventArgs e)
            {
                    var textBox = sender as TextBox;
                    var maskExpression = GetMaskExpression(textBox);
                    if (maskExpression == null)
                    {
                            return;
                    }
                    //pressing space doesn't raise PreviewTextInput - no idea why, but we need to handle
                    //explicitly here
                    if (e.Key == Key.Space)
                    {
                            var proposedText = GetProposedText(textBox, " ");
                            if (!maskExpression.IsMatch(proposedText))
                            {
                                    e.Handled = true;
                            }
                    }
            }
            private static void Pasting(object sender, DataObjectPastingEventArgs e)
            {
                    var textBox = sender as TextBox;
                    var maskExpression = GetMaskExpression(textBox);
                    if (maskExpression == null)
                    {
                            return;
                    }
                    if (e.DataObject.GetDataPresent(typeof(string)))
                    {
                            var pastedText = e.DataObject.GetData(typeof(string)) as string;
                            var proposedText = GetProposedText(textBox, pastedText);
                            if (!maskExpression.IsMatch(proposedText))
                            {
                                    e.CancelCommand();
                            }
                    }
                    else
                    {
                            e.CancelCommand();
                    }
            }
            private static string GetProposedText(TextBox textBox, string newText)
            {
                    var text = textBox.Text;
                    if (textBox.SelectionStart != -1)
                    {
                            text = text.Remove(textBox.SelectionStart, textBox.SelectionLength);
                    }
                    text = text.Insert(textBox.CaretIndex, newText);
                    return text;
            }
    }