2013-03-09 28 views
5

Chcę tłumić naciśnięcie klawisza w TextBox. Aby stłumić wszystkie naciśnięcia klawiszy innych niż Backspace, używam następujące:Jak zapobiec uderzeniu klawiszem Backspace w TextBox?

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

Jednak ja tylko chce stłumić klawiszy, gdy naciśnięty klawisz Backspace było. Używam:

 if (e.Key == System.Windows.Input.Key.Back) 
     { 
      e.Handled = true; 
     } 

To jednak nie działa. Postać stojąca za początkiem selekcji nadal jest usuwana. Na wyjściu dostaję "TRUE", więc rozpoznawany jest klawisz Back. Jak mogę zapobiec naciśnięciu klawisza Backspace? (Moim powodem jest to, że chcę usunąć słowa zamiast znaków w niektórych przypadkach, dlatego muszę obsługiwać klawisz wstecz)).

+0

Czy nie ma wydarzenia takiego jak "PreviewKeyDown"? –

+0

Silverlight dla Windows Phone nie zawiera implementacji PreviewKeyDown. –

Odpowiedz

0

To prawda, że ​​nie ma łatwego sposobu radzenia sobie z tym scenariuszem, ale jest to możliwe.

Musisz utworzyć niektóre zmienne składowe w klasie, aby zapisać stan tekstu wejściowego, pozycji kursora i naciśnięcia klawisza wstecz podczas przechodzenia między zdarzeniami KeyDown, TextChanged i KeyUp.

Kod powinien wyglądać mniej więcej tak:

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

Dziękuję, dobre obejście. – msbg

+0

Przyjęte rozwiązanie nie jest najlepsze. Lepsza sugestia [poniżej] (http: // stackoverflow.com/questions/15316179/how-to-prevent-a-backspace-stroke-in-a-textbox/18062836 # 18062836) przy użyciu e.SuppressKeyPress – tofo

3

W Silverlight nie ma sposobu na obsługę zdarzeń klucza systemowego, takie jak backspace. Dlatego można go wykryć, ale nie obsługuje go ręcznie.

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

Wymaga to, że możemy przechowywać wartość w polu tekstowym przed wydarzeniem kluczowym dół. Niestety, backspace jest obsługiwane zanim to wydarzenie zostanie uruchomione, więc musimy je przechwycić, zanim to nastąpi, a następnie możemy zaktualizować je ponownie po zakończeniu zdarzenia 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

Po prostu ustaw e.SuppressKeyPress = true (w zdarzeniu KeyDown), gdy chcesz powstrzymać naciśnięcie klawisza. Ex zapobiec Backspace key zmienić tekst w polu tekstowym za pomocą następującego kodu:

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

to co wymyśliłem, aby usunąć poprzedni (CtrlBackspace) i następnego słowa (CtrlUsuń), obsługę wielu kolejnych białych znaków (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); 
     } 

    } 
} 

Dzięki Huy Nguyen dla e.SuppressKeyPress = true;!

Jeśli istnieje wybór, zarówno Delete i Backspace usunie zaznaczenie, niezależnie od klawiszy modyfikujących (nie dostaniesz tego brzydkiego charakteru prostokątny dla gospodarstwa Ctrl)

wydaje się działać dla znaków jak jako cóż, chociaż może nie mieć większego sensu (czy ta postać nie jest całe słowo?)