在WPF文本框中粘贴事件

我创build了一个inheritanceTextBox的自定义控件。 这个自定义控件是一个数字TextBox ,只支持数字。

我正在使用OnPreviewTextInput来检查每个新键入的字符,看看这个字符是否是一个有效的input。 这很好。 但是,如果我将文本粘贴到TextBox ,则不会触发OnPreviewTextInput

TextBox捕获粘贴文本的最佳方法是什么?

另外,我有一个问题,当后面的空间被按下时,我不知道什么事件会触发。 OnPreviewTextInput没有被解雇!

任何想法如何在WPF TextBox捕获粘贴的文本和背部空间事件?

这里有一些代码,我曾经躺在身边,以防万一我需要它。 可以帮助你。

 public Window1() { InitializeComponent(); // "tb" is a TextBox DataObject.AddPastingHandler(tb, OnPaste); } private void OnPaste(object sender, DataObjectPastingEventArgs e) { var isText = e.SourceDataObject.GetDataPresent(DataFormats.UnicodeText, true); if (!isText) return; var text = e.SourceDataObject.GetData(DataFormats.UnicodeText) as string; ... } 

试图拦截和陷阱可能导致TextBox.Text属性更改的所有单个事件的麻烦是,有很多这样的事件:

  • TextInput:用户types
  • KeyDown:删除,退格,回车,input法
  • 命令手势:Ctrl-X,Ctrl-Y,Ctrl-V,Ctrl-X
  • MouseDown:粘贴button,剪切button,撤消button,…
  • 单击:粘贴,剪切,撤消button具有本地焦点时按空格键
  • RaiseEvent:代码提出粘贴,剪切,撤消,重做命令
  • Accessiblity:声音命令,盲文键盘等

试图可靠地拦截所有这些是徒劳的。 一个更好的解决scheme是监视TextBox.TextChanged并拒绝你不喜欢的更改。

在这个答案中,我展示了如何为被问到的特定场景实现一个TextBoxRestriction类。 这种相同的技术可以通用于任何你想放在你的TextBox控件上的限制。

例如,在你的情况下,你可能会实现一个RestrictValidChars附加属性,类似于该代码中的RestrictDeleteTo属性。 这将是相同的,除了内循环将检查插入,而不是删除。 它会像这样使用:

 <TextBox my:TextBoxRestriction.RestrictValidChars="0123456789" /> 

这只是一个如何处理的想法。 有很多方法来构build你的代码,取决于你想要的。 例如,您可以更改TextBoxRestriction来调用您自己的代码,以使用附加的属性来validation代理或包含事件的对象。

有关如何在使用TextBoxRestriction类时如何绑定Text属性的详细信息,请参阅其他答案,以便在您不需要时不会触发限制。

对于退格,请检查PreviewKeyDown事件

对于粘贴命令,添加一个命令绑定到ApplicationCommands.Paste,并设置参数处理,如果你不想做任何事情:

 <Window.CommandBindings> <CommandBinding Command="ApplicationCommands.Paste" Executed="PasteExecuted" /> </Window.CommandBindings> 

在代码后面:

 private void PasteExecuted(object sender, ExecutedRoutedEventArgs e) { e.Handled = true; } 

您可以通过PreviewKeyDown事件和TextChanged事件来实现此目的。

PreviewKeyDown捕获粘贴操作

 if(Key.V == e.Key && Keyboard.Modifiers == ModifierKeys.Control) { strPreviousString = this.txtNumber.Text; bIsPasteOperation = true; } 

TextChanged事件中

 if (true == bIsPasteOperation) { if (false == this.IsNumber(this.txtNumber.Text)) { this.txtNumber.Text = strPreviousString; e.Handled = true; } bIsPasteOperation = false; } 

IsNumber方法validationinput的文本是否为Number

 private bool IsNumber(string text) { int number; //Allowing only numbers if (!(int.TryParse(text, out number))) { return false; } return true }