2009-04-02 17 views
7

Silverlight TextBox'a girilen bir sekmeyi nasıl yakalayabilirim ve 4 boşluğu (veya bir sekmeyi) yerine yerleştirebilirim?Silverlight TextBox'ta yakalama sekmesi

Sekme gezinmeyi nasıl engelleyebileceğimi anlayamıyorum.

+0

Silverlight TextBox kontrolü bir "AcceptsTab" özelliği var mı? Bunu, TextBox tarafından işlenecek sekme tuşu için True olarak ayarlamanız gerekir. –

+0

hayır, Intellisense veya Expression Blend'de bu özelliği görmüyorum –

cevap

8

metin kutusunun başına gelir. 'Sekme' anahtar:

 private const string Tab = " "; 
    void textBox_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.Key == Key.Tab) 
     { 
      int selectionStart = textBox.SelectionStart; 
      textBox.Text = String.Format("{0}{1}{2}", 
       textBox.Text.Substring(0, textBox.SelectionStart), 
       Tab, 
       textBox.Text.Substring(textBox.SelectionStart + textBox.SelectionLength, (textBox.Text.Length) - (textBox.SelectionStart + textBox.SelectionLength)) 
       ); 
      e.Handled = true; 
      textBox.SelectionStart = selectionStart + Tab.Length; 
     } 
    } 

Bu metin seçip ol vurmak bile beklediğiniz sadece nasıl davranır (kod e ben Johannes benzer)' ne olduğunu.

Bir şey daha: Sekme dizgisini "\ t" olarak almayı denedim, ancak boşuna. Sekme oluşturuldu, ancak tek bir boşluğun genişliğiydi - bu nedenle Sekme yapısının dört boşluk olduğu değer.

1

Sorununuzu nasıl çözeceğimi bilmiyorum, çalıştığı anlaşılan bir çözümü bir araya getirdim.

KeyDown olayını aşağıdaki gibi ayarlayın. LostFocus içinde

void expenses_KeyDown(object sender, KeyEventArgs e) 
     { 
      if (e.Key == Key.Tab) 
      { 
       expenses.Text += " "; 
       expenses.Focus(); 
       expenses.LostFocus += new RoutedEventHandler(expenses_LostFocus); 
      } 
     } 

Ve sonra:

void expenses_LostFocus(object sender, RoutedEventArgs e) 
     { 
      expenses.Focus(); 
      expenses.Select(expenses.Text.Length - 1, 0); 
     } 

LostFocus son satır metnin sonuna düzenleme imlecini ayarlar durumunda

expenses.KeyDown += new KeyEventHandler(expenses_KeyDown); 

Ben aşağıdaki kodu koymak aksi halde, odağı aldığında, imleç konumu

1

Bu benim için iyi iş gibi görünüyordu, ve metin kutusu adının ikinci olay işleyicisi veya sabit kodlama gerektirmez:

void TabbableTextBox_KeyDown(object sender, KeyEventArgs e) 
     { 
      if (e.Key == Key.Tab) 
      { 
       e.Handled = true; 

       var tb = ((TextBox)sender); 
       tb.Text += "\t"; 
       tb.Select(tb.Text.Length, 0); 
      } 
     }