2010-06-03 48 views
6

Estoy usando un ComboBox editable en wpf pero cuando intento establecer el foco desde el código C#, solo muestra la selección. pero quiero ir a la opción de edición (el cursor debe mostrarse para la entrada del usuario).Cómo agregar un foco a un ComboBox editable en WPF

+0

¿Podría dar un ejemplo de su código? PD: No te devolví el voto. – Anvaka

Respuesta

3

Usted puede tratar de derivados de ComboBox y acceder al cuadro de texto interno, así:

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 
    } 

} 

En su código que usaría así:

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

Esta solución ligeramente peligrosa, sin embargo, porque en las próximas versiones de WPF, Microsoft podría decidir agregar un manejador de eventos GotKeyboardFocus (o manejadores de eventos similares), lo que podría entrar en conflicto con el controlador de eventos en MyComboBox.

9

Usted puede probar este código:

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

Ningún código citado aquí está funcionando. –

+2

@RAJK Ese código funcionó perfectamente para mí. Resuelve adecuadamente el problema de necesitar atención en un cuadro combinado editable cuando se muestra una ventana por primera vez. Lo que no está claro es que debe colocar el código en el evento Loaded de la ventana que contiene el combobox editable. –

+0

¡Perfecto! ¡Me solucionó muchos y muchos problemas! Muchas gracias! –

3

Sobre la base de la respuesta de user128300 anterior se me ocurrió una solución un poco más sencillo. En el constructor o ContextChangedHandler el código está esperando que el control se carga antes de poner el foco en el elemento de la interfaz de usuario

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

Luego, en el foco, incluso manejador selecciono todo el texto desde el principio hasta el final

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

En xaml el cuadro combinado es editable. Al seleccionar todo el texto cuando el usuario introduzca una clave que está restableciendo el valor anterior

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

Sobre la base de la respuesta de Rikker Serg, puede utilizar ese código en su constructor (después de InitializeComponent) y despachar en lugar de tener que crear personalizada controles o manejadores de eventos.

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

} 
Cuestiones relacionadas