visual studio que puede programacion presentacion hacer ejemplos desventajas con animaciones wpf events textbox

studio - Pegar evento en un cuadro de texto WPF



visual studio wpf (4)

Aquí hay un código que tenía por ahí en caso de que alguna vez lo necesitara. Podría ayudarte.

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

Creé un control personalizado que hereda TextBox . Este control personalizado es un TextBox numérico, solo admite números.

Estoy usando OnPreviewTextInput para verificar cada nuevo carácter que se escribe para ver si el carácter es una entrada válida. Esto funciona genial Sin embargo, si OnPreviewTextInput el texto en el TextBox , OnPreviewTextInput no se OnPreviewTextInput .

¿Cuál es la mejor manera de capturar texto pegado en un TextBox ?

Además, tengo un problema cuando se presiona el espacio de fondo, no puedo entender qué evento disparará. OnPreviewTextInput no se OnPreviewTextInput !

¿Alguna idea sobre cómo capturar el texto pegado y los eventos del espacio posterior en WPF TextBox ?


El problema al intentar interceptar y atrapar todos los eventos individuales que pueden hacer que cambie una propiedad TextBox.Text es que hay muchos de estos eventos:

  • TextInput: tipos de usuario
  • KeyDown: Eliminar, Retroceder, Entrar, IME
  • Gestos de comando: Ctrl-X, Ctrl-Y, Ctrl-V, Ctrl-X
  • MouseDown: botón Pegar, botón Cortar, botón Deshacer, ...
  • Haga clic en: Barra espaciadora presionada cuando los botones Pegar, Cortar, Deshacer tienen un enfoque local
  • RaiseEvent: Code plantea los comandos Pegar, Cortar, Deshacer, Rehacer
  • Accesibilidad: comandos de voz, teclados Braille, etc.

Intentar interceptar de manera confiable todos estos es un ejercicio inútil. Una solución mucho mejor es supervisar TextBox.TextChanged y rechazar los cambios que no te gusten.

En esta respuesta muestro cómo implementar una clase TextBoxRestriction para el escenario particular sobre el que se está preguntando. Esta misma técnica se puede generalizar para su uso con cualquier restricción que desee colocar en su control TextBox.

Por ejemplo, en su caso puede implementar una propiedad adjunta RestrictValidChars forma similar a la propiedad RestrictDeleteTo en ese código. Sería lo mismo, excepto que el bucle interno verificaría las inserciones, no las eliminaría. Se usaría así:

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

Esta es solo una idea de cómo se podría manejar. Hay muchas formas de estructurar su código según lo que desee. Por ejemplo, puede cambiar TextBoxRestriction para llamar a su propio código y validarlo usando una propiedad adjunta que toma un delegado o un objeto que contiene un evento.

Consulte la otra respuesta para obtener detalles sobre cómo enlazar la propiedad Text cuando usa la clase TextBoxRestriction para que no active la restricción cuando no lo desee.


Para el retroceso, verifique el evento PreviewKeyDown

Para el comando pegar, agregue un enlace de comando a ApplicationCommands.Paste y establezca el argumento a manejado, si no desea hacer nada con él:

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

Y en código detrás:

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


Puede lograr esto con el evento TextChanged y el evento TextChanged .

En PreviewKeyDown captura la operación Pegar

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

En evento TextChanged

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

Donde el método IsNumber valida el texto ingresado es Número o no

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