2010-06-03 13 views

Odpowiedz

3

Można spróbować wynikające z ComboBox i dostępu do wewnętrznej TextBox, tak:

public class MyComboBox : ComboBox 
{ 
    TextBox _textBox; 

    public override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 

     _textBox = Template.FindName("PART_EditableTextBox", this) as TextBox; 
     if (_textBox != null) 
     { 
      _textBox.GotKeyboardFocus += _textBox_GotFocus; 
      this.Unloaded += MyComboBox_Unloaded; 
     } 
    } 

    void MyComboBox_Unloaded(object sender, System.Windows.RoutedEventArgs e) 
    { 
     _textBox.GotKeyboardFocus -= _textBox_GotFocus; 
     this.Unloaded -= MyComboBox_Unloaded; 
    } 

    void _textBox_GotFocus(object sender, System.Windows.RoutedEventArgs e) 
    { 
     _textBox.Select(_textBox.Text.Length, 0); // set caret to end of text 
    } 

} 

W kodzie będzie go używać tak:

<Window x:Class="EditableCbox.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:EditableCbox" 
    Title="Window1" Height="300" Width="300"> 
    ... 
     <local:MyComboBox x:Name="myComboBox" IsEditable="True" Grid.Row="0" Margin="4"> 
      <ComboBoxItem>Alpha</ComboBoxItem> 
      <ComboBoxItem>Beta</ComboBoxItem> 
      <ComboBoxItem>Gamma</ComboBoxItem> 
     </local:MyComboBox> 
    ... 
</Window> 

Rozwiązanie to nieco niebezpieczne, jednak ponieważ w nadchodzących wersjach WPF Microsoft może również zdecydować o dodaniu obsługi zdarzeń GotKeyboardFocus (lub podobnych programów obsługi zdarzeń), które mogą wchodzić w konflikt z obsługą zdarzeń w MyComboBox.

9

Można spróbować tego kodu:

 var textBox = (comboBox.Template.FindName("PART_EditableTextBox", comboBox) as TextBox); 
     if (textBox != null) 
     { 
      textBox.Focus(); 
      textBox.SelectionStart = textBox.Text.Length; 
     } 
+1

Żaden kod cytowany tutaj nie działa. –

+2

@RAJK Ten kod działał idealnie dla mnie. Poprawnie rozwiązuje problem konieczności ustawiania ostrości na edytowalnym polu wyboru, gdy okno jest wyświetlane po raz pierwszy. To, co nie zostało wyraźnie powiedziane, to umieszczenie kodu w załadowanym zdarzeniu okna zawierającego edytowalny combobox. –

+0

Idealny! Rozwiązałem wiele problemów! Dziękuję bardzo! –

3

Na podstawie odpowiedzi z user128300 powyżej wymyśliłem nieco prostsze rozwiązanie. W konstruktorze lub ContextChangedHandler kod czeka na kontroli mają być załadowane przed oddaniem nacisk na element UI

myComboBox.GotFocus += MyComboBoxGotFocus; 
myComboBox.Loaded += (o, args) => { myComboBox.Focus(); }; 

Następnie w ostrości nawet obsługi I zaznaczyć cały tekst od początku do końca

private void MyComboBoxGotFocus(object sender, RoutedEventArgs e) 
{ 
    var textBox = myComboBox.Template.FindName("PART_EditableTextBox", myComboBox) as TextBox; 
    if (textBox != null) 
     textBox.Select(0, textBox.Text.Length); 
} 

W XAML combobox jest edytowalny. Wybierając cały tekst, gdy użytkownik wpisz klucz jest zresetowanie poprzednią wartość

<ComboBox x:Name="myComboBox" IsEditable="True" /> 
0

podstawie odpowiedzi Rikker serg, można użyć tego kodu w konstruktorze (po InitializeComponent) i wysyła go zamiast konieczności tworzenia niestandardowych kontrolki lub programy obsługi zdarzeń.

public NewMessageWindow() 
{ 
    InitializeComponent(); 

    Dispatcher.BeginInvoke(new Action(() => 
    { 
     var textBox = myComboBox.Template.FindName("PART_EditableTextBox", cbUsers) as TextBox; 
     if (textBox != null) 
     { 
      textBox.Focus(); 
      textBox.SelectionStart = textBox.Text.Length; 
     } 
    })); 

}