在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 }