2013-03-09 13 views
5

Voglio sopprimere un tratto chiave in un controllo TextBox. Per eliminare tutte le battiture diversi Backspace, io uso il seguente:Come evitare un tratto chiave backspace in un controllo TextBox?

private void KeyBox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e) 
    { 
     e.Handled = true; 
    } 

Tuttavia, voglio solo per sopprimere i tasti quando il tasto premuto è stato Backspace. Io uso il seguente:

Tuttavia, questo non funziona. Il carattere dietro l'inizio della selezione è ancora cancellato. Ottengo "VERO" nell'output, quindi viene riconosciuto il tasto Indietro. Come potrei impedire all'utente di premere backspace? (Il mio motivo per questo è che in alcuni casi voglio eliminare le parole anziché i caratteri, quindi devo gestire il tasto indietro).)

+0

Non c'è un evento come "PreviewKeyDown"? –

+0

Silverlight per Windows Phone non supporta un'implementazione di PreviewKeyDown. –

risposta

0

È vero che non esiste un modo semplice per gestire questo scenario, ma è possibile.

È necessario creare alcune variabili membro nella classe per memorizzare lo stato del testo di input, la posizione del cursore e lo stato premuto tasto indietro mentre si passa tra gli eventi KeyDown, TextChanged e KeyUp.

Il codice dovrebbe essere simile a questa:

string m_TextBeforeTheChange; 
    int m_CursorPosition = 0; 
    bool m_BackPressed = false; 

    private void KeyBox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e) 
    { 
     m_TextBeforeTheChange = KeyBox.Text; 
     m_BackPressed = (e.Key.Equals(System.Windows.Input.Key.Back)) ? true : false; 
    } 

    private void KeyBox_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     if (m_BackPressed) 
     { 
      m_CursorPosition = KeyBox.SelectionStart; 
      KeyBox.Text = m_TextBeforeTheChange; 
     } 
    } 

    private void KeyBox_KeyUp(object sender, System.Windows.Input.KeyEventArgs e) 
    { 
     KeyBox.SelectionStart = (m_BackPressed) ? m_CursorPosition + 1 : KeyBox.SelectionStart; 
    } 
+0

Grazie, buona soluzione. – msbg

+0

La soluzione accettata non è la migliore. Migliore suggerimento [di seguito] (http: // StackOverflow.it/questions/15316179/how-to-prevent-a-backspace-key-stroke-in-a-textbox/18062836 # 18062836) utilizzando e.SuppressKeyPress – tofo

3

In Silverlight, non c'è modo di gestire gli eventi dei tasti di sistema, come backspace. Pertanto, è possibile rilevarlo, ma non gestirlo manualmente.

0
string oldText = ""; 
    private void testTextBlock_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     if (testTextBlock.Text.Length < oldText.Length) 
     { 
      testTextBlock.Text = oldText; 
      testTextBlock.SelectionStart = oldText.Length; 
     } 
     else 
     { 
      oldText = testTextBlock.Text; 
     } 
    } 
0

Ciò richiede che memorizziamo il valore della casella di testo prima che l'evento chiave verso il basso. Sfortunatamente il backspace viene gestito prima che l'evento venga attivato, quindi dobbiamo catturarlo prima che avvenga e quindi possiamo aggiornarlo di nuovo dopo l'evento key up.

private string textBeforeChange; 

    private void TextBox1_OnKeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.Key == Key.Back) 
     { 
      e.Handled = true; 
      textBox1.Text = textBeforeChange; 
     } 
    } 

    private void TextBox1_OnKeyUp(object sender, KeyEventArgs e) 
    { 
     textBeforeChange = textBox1.Text; 
    } 

    private void MainPage_OnLoaded(object sender, RoutedEventArgs e) 
    { 
     textBox1.AddHandler(TextBox.KeyDownEvent, new KeyEventHandler(TextBox1_OnKeyDown), true); 
     textBox1.AddHandler(TextBox.KeyUpEvent, new KeyEventHandler(TextBox1_OnKeyUp), true); 
     textBox1.AddHandler(TextBox.ManipulationStartedEvent, new EventHandler<ManipulationStartedEventArgs>(TextBox1_OnManipulationStarted), true); 
    } 

    private void TextBox1_OnManipulationStarted(object sender, ManipulationStartedEventArgs e) 
    { 
     textBeforeChange = textBox1.Text; 
    } 
12

Basta impostare e.SuppressKeyPress = true (nel caso in KeyDown) quando si vuole sopprimere una sequenza di tasti. Ex, prevenire backspace chiave modificare il testo nella casella di testo utilizzando il seguente codice:

private void textBox1_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.Back) 
    { 
     e.SuppressKeyPress = true; 
    } 
} 
0

Questo è quello che mi è venuta per cancellare precedente (CtrlBackspace) e della parola successiva (CtrlDelete), la gestione di più caratteri di spaziatura successive (0x09, 0x20, 0xA0):

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace DeleteWord 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void textBox1_KeyDown(object sender, KeyEventArgs e) 
     { 
      // Tab, space, line feed 
      char[] whitespace = {'\x09', '\x20', '\xA0'}; 
      string text = textBox1.Text; 
      int start = textBox1.SelectionStart; 

      if ((e.KeyCode == Keys.Back || e.KeyCode == Keys.Delete) && textBox1.SelectionLength > 0) 
      { 
       e.SuppressKeyPress = true; 
       textBox1.Text = text.Substring(0, start) + text.Substring(start + textBox1.SelectionLength); 
       textBox1.SelectionStart = start; 
       return; 
      } 

      else if (e.KeyCode == Keys.Back && e.Control) 
      { 
       e.SuppressKeyPress = true; 

       if (start == 0) return; 

       int pos = Math.Max(text.LastIndexOfAny(whitespace, start - 1), 0); 

       while (pos > 0) 
       { 
        if (!whitespace.Contains(text[pos])) 
        { 
         pos++; 
         break; 
        } 
        pos--; 
       } 

       textBox1.Text = text.Substring(0, pos) + text.Substring(start); 
       textBox1.SelectionStart = pos; 
      } 
      else if (e.KeyCode == Keys.Delete && e.Control) 
      { 
       e.SuppressKeyPress = true; 

       int last = text.Length - 1; 

       int pos = text.IndexOfAny(whitespace, start); 
       if (pos == -1) pos = last + 1; 

       while (pos <= last) 
       { 
        if (!whitespace.Contains(text[pos])) break; 
        pos++; 
       } 

       textBox1.Text = text.Substring(0, start) + text.Substring(pos); 
       textBox1.SelectionStart = start; 
      } 
     } 

     protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
     { 
      if (keyData == Keys.Tab) 
      { 
       textBox1.Paste("\t"); 
       return true; 
      } 
      else if (keyData == (Keys.Shift | Keys.Tab)) 
      { 
       textBox1.Paste("\xA0"); 
       return true; 
      } 
      return base.ProcessCmdKey(ref msg, keyData); 
     } 

    } 
} 

Grazie a Huy Nguyen per e.SuppressKeyPress = true;!

Se c'è una selezione, sia Elimina e Backspace cancellerà la selezione, indipendentemente tasti di modifica (non sarà possibile ottenere quel personaggio rettangolare brutto per lo svolgimento di Ctrl)

sembra funzionare per i caratteri come come beh, anche se potrebbe non avere molto senso (non è questa parola una parola intera?)

Problemi correlati