2015-06-12 13 views
6

Mam sposób zaznaczania całego tekstu po kliknięciu na TextBox; Chcę zrobić to samo dla edytowalnego combobox - din znaleźć wszystko. Mój kod dla TextBox toEdytowalne przez WPF ComboBox SelectAll po kliknięciu

private void OnPreviewMouseDown(Object sender, MouseButtonEventArgs e) 
{ 
    txtBox.SelectAll(); 
    txtBox.Focus(); 
    e.Handled = true; 
} 

Jak można zrobić to samo dla edytowalnego combobox?

Aktualizacja Kod Combox że daje mi wyjście, które chcę:

private void cboMouseDown(object sender, MouseButtonEventArgs e) 
     { 
      var textBox = (cbo.Template.FindName("PART_EditableTextBox", cbo) as TextBox); 
      if (textBox != null) 
      { 
       textBox.SelectAll(); 
       cbo.Focus(); 
       e.Handled = true; 
      } 
     } 

ale teraz rozwijanej combobox nie działa, jakieś sugestie?

Update-2: Zamiast PreviewMouseDown - wypróbowałem PreviewMouseUp i teraz pojawi się rozwijane menu; ale gdy raz kliknęło to pole, a następnie spróbował otworzyć rozwijane okno - okno zamarzło. Jednak wykonałem pracę, o której pisałem poniżej. Byłbym wdzięczny za komentarze, jeśli jest to właściwe i bezpieczne rozwiązanie.

+0

Dlaczego nie używać 'Focus' zdarzenie (na obu kontrolach)? Zdarzenia myszy nie działają we wszystkich przypadkach (nawigacja za pomocą klawiatury, dotyk, ...). – ChrFin

+0

W trybie Gotfocus tekst jest domyślnie zaznaczony. Moim wymaganiem jest wpisanie niektórych znaków, jeśli użytkownik kliknie to, co wpisał - cały tekst zostanie wybrany tak, aby mógł zacząć od nowa. Domyślne zachowanie polega na tym, że pierwszy raz klikniesz cały tekst; ale po następnym kliknięciu kursor przechodzi do miejsca kliknięcia, a tekst pozostaje niewybrany. – marifrahman

+1

** Wystarczy sprawdzić te linki - ** [Wybierz ComboBox Tekst] [1] [Jak dodać skupić na edytowalny ComboBox w WPF] [2] [1]: http: // stackoverflow.com/q/19728650/2025489 [2]: http://stackoverflow.com/a/2964222/2025489 – LogicalDesk

Odpowiedz

5

Zastosowanie GotFocus wydarzenie i wybrać tekst jak ten

var comboTextBoxChild = comboBox.FindChild(typeof(TextBox), "PART_EditableTextBox") as TextBox; 

    comboTextBoxChild .SelectAll(); 

Tutaj combobox to nazwa edycji Combobox

+0

Jeśli zrobię to na PreviewMouseDown z Combobox dostaję to, czego chcę - ale problem jest taki, że rozwijanie się nie otwiera. – marifrahman

3

Możliwym rozwiązaniem mam i jego pracy dla mnie - Potrzebuję sugestię chociaż jeśli to jest w porządku albo nie; Używam zdarzenie PreviewMouseUp z ComboBox:

private void cboMouseUp(object sender, MouseButtonEventArgs e) 
     { 
      var textBox = (cbo.Template.FindName("PART_EditableTextBox", cbo) as TextBox); 
      if (textBox != null && !cbo.IsDropDownOpen) 
      { 
       Application.Current.Dispatcher.BeginInvoke(new Action(()=>{ 
        textBox.SelectAll(); 
        textBox.Focus(); 
        //e.Handled = true; 
       })); 
      } 
1

Jestem trochę późno na imprezę, ale miałem ten sam problem w ostatnim czasie i po przetestowaniu kilku rozwiązań wymyśliłem własną rękę (I utworzony formant niestandardowy do tego celu) :

public class ComboBoxAutoSelect : ComboBox 
{ 
    private TextBoxBase textBox; 

    public override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 
     textBox = GetTemplateChild("PART_EditableTextBox") as TextBoxBase; 
    } 

    protected override void OnPreviewGotKeyboardFocus(KeyboardFocusChangedEventArgs e) 
    { 
     // if event is called from ComboBox itself and not from any of underlying controls 
     // and if textBox is defined in control template 
     if (e.OriginalSource == e.Source && textBox != null) 
     { 
      textBox.Focus(); 
      textBox.SelectAll(); 
      e.Handled = true; 
     } 
     else 
     { 
      base.OnPreviewGotKeyboardFocus(e); 
     } 
    } 
} 

można zrobić to samo z wydarzeń, ale trzeba będzie szukać „PART_EditableTextBox” za każdym razem, a tu to zrobić tylko raz na zmianę szablonu

Powiązane problemy