简体   繁体   中英

how to validate the string in clipboard in WPF?

in my WPF textbox i have validated it on following events

TextChanged PreviewTextInput

so that user cannot allow special characters in it , but user is able to paste the special character either through ctrl+v key or by right click of mouse and paste.

How to validate these two extra events on textbox.

The clipboard services support PastingHandlers

      DataObject.AddPastingHandler(textBox, OnPaste);

In the handler cancel the handler for invalid data .... I think it has e.CancelCommand() call.

You can write a pasting event by using DataObjectPastingEventArgs, refer to this to control pasting

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"/>  

Code behind :

   /// <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;
            }
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM