62 votes

Coller un événement dans une zone de texte WPF

J'ai créé un contrôle personnalisé hériter zone de texte. Ce contrôle personnalisé est une zone de texte numérique, ne supportant des nombres.

Je suis à l'aide de OnPreviewTextInput de vérifier chaque nouveau caractère tapé pour voir si le caractère est une entrée valide. Cela fonctionne très bien. Cependant, si je colle le texte dans la zone de texte, OnPreviewTextInput n'est pas déclenché.

Quelle est la meilleure façon de capturer le texte collé dans une zone de texte?

Aussi, j'ai un problème lorsque l'espace arrière est pressée, je n'arrive pas à comprendre quel événement ce sera le feu. OnPreviewTextInput n'est pas déclenché!

des idées comment faire pour capturer le texte collé et à l'arrière de l'espace des événements dans WPF zone de texte?

Merci

125voto

Matt Hamilton Points 98268

Voici un code que je traînais au cas où j'en aurais besoin. Pourrait vous aider.

 public Window1()
{
    InitializeComponent();

    // "tb" is a TextBox
    DataObject.AddPastingHandler(tb, new DataObjectPastingEventHandler(OnPaste));
}

private void OnPaste(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;
    ...
}
 

15voto

Ray Burns Points 38537

Le problème avec le fait d'essayer d'intercepter et de piéger tous les événements qui pourraient causer une zone de texte.Texte de la propriété de changer, c'est que il ya beaucoup de ces événements:

  • TextInput: les types d'Utilisateurs
  • KeyDown: Supprimer, retour arrière, Entrée, IME
  • Commande Gestuelle: Ctrl-X, Ctrl-A, Ctrl-V Ctrl-X
  • MouseDown: bouton Coller, Couper bouton, bouton d'Annulation, ...
  • Cliquez sur: barre d'Espace enfoncée lorsque vous Coller, Couper, Défaire les boutons ont vocation locale
  • RaiseEvent: Code soulève Coller, Couper, Défaire, Refaire des commandes
  • Accessiblité: commandes Vocales, les claviers en Braille, etc

En essayant d'intercepter de manière fiable toutes ces est un exercice futile. Une bien meilleure solution est de surveiller la zone de texte.TextChanged et rejeter les modifications que vous n'aimez pas.

Dans cette réponse , je montre comment mettre en œuvre une TextBoxRestriction classe pour le scénario particulier posées à propos de. Cette même technique peut être généralisée pour une utilisation avec toutes les restrictions que vous souhaitez placer sur votre contrôle de zone de texte.

Par exemple, dans votre cas, vous pourriez implemnt un RestrictValidChars de la propriété attachée de la même manière à l' RestrictDeleteTo propriété dans le code. Il serait le même, sauf que la boucle interne serait de vérifier les insertions, les supprime pas. Il serait utilisé comme ceci:

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

C'est juste une idée de comment il pourrait en être traitées. Il existe de nombreuses façons de structurer votre code en fonction de ce que vous voulez. Par exemple, vous pouvez changer TextBoxRestriction pour appeler votre propre code pour valider à l'aide d'une propriété attachée qui prend un délégué ou d'un objet contenant un événement.

Voir les autres répondre pour plus de détails sur la façon de lier la propriété de Texte lorsque vous utilisez le TextBoxRestriction classe afin de ne pas déclencher la restriction lorsque vous ne voulez pas qu'il.

7voto

Arcturus Points 14366

Pour le retour arrière, veuillez vérifier l'événement PreviewKeyDown.

Pour la commande coller, ajoutez une commande de liaison à ApplicationCommands.Paste et définissez l'argument sur manipulé, si vous ne souhaitez rien faire avec:

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

Et dans le code derrière:

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

2voto

Syed Points 340

Vous pouvez y parvenir avec PreviewKeyDown événement et TextChanged événement.

En PreviewKeyDown capturer l'opération Coller

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

En TextChanged événement

 if (true == bIsPasteOperation)
{

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

Où la méthode IsNumber valide le texte saisi est numérique ou non

 private bool IsNumber(string text)
{
   int number;

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X