2010-06-03 9 views
6

Sto usando un ComboBox modificabile in wpf ma quando provo a impostare lo stato attivo dal codice C#, viene mostrata solo la selezione. ma voglio andare per l'opzione di modifica (il cursore dovrebbe essere visualizzato per l'input dell'utente).Come aggiungere un focus a un ComboBox modificabile in WPF

+0

Potrebbe fornire un esempio del codice? PS: non ti ho minimizzato. – Anvaka

risposta

3

Si potrebbe provare derivanti da ComboBox e accedere al TextBox interna, in questo modo:

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 
    } 

} 

Nel codice si usa in questo modo:

<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> 

Questa soluzione un po 'pericoloso, tuttavia, poiché nelle prossime versioni di WPF, Microsoft potrebbe decidere di aggiungere anche un gestore di eventi GotKeyboardFocus (o gestori di eventi simili), che potrebbero entrare in conflitto con il gestore di eventi in MyComboBox.

9

Si può provare questo codice:

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

nessun codice qui citato funziona. –

+2

@RAJK Quel codice ha funzionato perfettamente per me. Risolve correttamente il problema di dover concentrarsi su una combobox modificabile quando viene visualizzata per la prima volta una finestra. Ciò che non è indicato chiaramente è che è necessario inserire il codice nell'evento Loaded della finestra contenente la casella combinata modificabile. –

+0

Perfetto! Risolti molti e molti problemi! Grazie mille! –

3

Sulla base della risposta del user128300 sopra mi si avvicinò con una soluzione leggermente più semplice. Nel costruttore o ContextChangedHandler il codice è in attesa per il controllo da caricare prima di mettere il fuoco sul elemento dell'interfaccia utente

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

Poi nel fuoco anche gestore seleziono tutto il testo dall'inizio alla fine

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

In xaml la casella combinata è modificabile. Selezionando tutto il testo quando l'utente digita una chiave è ripristinare il valore precedente

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

in base alla risposta del Rikker Serg, è possibile utilizzare tale codice nel costruttore (dopo InitializeComponent) e spedirlo invece di aver bisogno di creare su misura controlli o gestori di eventi.

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

}