2013-03-09 21 views
5

Bir TextBox'ta bir tuş vuruşunu bastırmak istiyorum. preslenmiş anahtar Geri ikenBir TextBox'ta backspace tuş darbesi nasıl önlenir?

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

Ancak, ben sadece tuş vuruşlarını bastırmak istiyorum: Backspace dışındaki tüm tuş vuruşlarını bastırmak için aşağıdaki kullanın. Aşağıdakileri kullanıyorum: Bu, çalışmaz. Ancak, bu çalışmaz. Seçim başlangıcındaki karakter hala silinmiştir. Çıktıda "DOĞRU" alıyorum, bu yüzden Geri tuşu tanınıyor. Kullanıcının arka tuşa basmasını nasıl engellerim? (Bunun sebebi, bazı durumlarda karakter yerine sözcükleri silmek istiyorum ve bu yüzden arka tuşa basmam gerekiyor)))

+0

"PreviewKeyDown" gibi bir etkinlik yok mu? –

+0

Windows için Silverlight Phone, PreviewKeyDown uygulamasının bir uygulamasını yürütmemektedir. –

cevap

0

Bu senaryoyu işlemenin kolay bir yolu bulunmadığı doğrudur, ancak bu mümkündür. KeyDown, TextChanged ve KeyUp olayları arasında geçiş yaptığımız sırada giriş metninin durumunu, imleç konumunu ve arka tuşa basma durumunu kaydetmek için sınıfta bazı üye değişkenleri oluşturmanız gerekir.

kodu şöyle görünmelidir:

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

Teşekkür ederim, iyi bir çözüm. – msbg

+0

Kabul edilen çözüm en iyisi değil. Daha iyi öneri [aşağıda] (http: // stackoverflow.com.tr/Sorular/15316179/nasıl yapılır? a-text-in-a-textbox-in-a-textbox/18062836 # 18062836) kullanarak e.SuppressKeyPress – tofo

3

Silverlight'da, sistem anahtarı olaylarını işlemenin bir yolu yoktur. backspace gibi. Bu nedenle, bunu algılayabilir, ancak elle işlemezsiniz.

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

Biz anahtar aşağı olaydan önce metin kutusunun değerini depolamak gerektirir. Beklenmedik bir şekilde, o olayın gerçekleşmesinden önce geri alan ele alınır, bu yüzden bu işlem gerçekleşmeden önce onu ele geçirmeliyiz ve ardından anahtar olayından sonra tekrar güncelleyebiliriz.

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

Sadece set Eğer bir tuş bastırmak istediğinizde (KeyDown olayı) gerçek e.SuppressKeyPress =. Ör, önlemek Aşağıdaki kodu kullanarak metin kutusuna metni değiştirmek için geri silme tuşu: Bu silmeyi önceki (CtrlBackspace) ve bir sonraki kelime ile geldi

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

budur (Ctrl Sil), çoklu müteakip boşluk karakterlerini (0x09, 0x20, 0xA0) işleme: e.SuppressKeyPress = true; için Huy Nguyen

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

    } 
} 

Teşekkür!

orada, bir seçim yapalım hem Sil ve Geri

(Ctrltutmak için o çirkin dikdörtgen karakteri almazsınız) değiştirici tuşlarının bakılmaksızın, seçim silecektir olarak gibi karakter için çalışmak gibi görünüyor Eğer iyi, çok anlamlı olmasa da (bu karakter tam bir kelime değil mi?)