2010-02-17 10 views
6

Normalmente llamo al myControl.Focus() en el controlador de eventos Loaded, pero esto no parece funcionar para un ListBox que está vinculado a una lista de objetos personalizados. Cuando inicio mi aplicación, se selecciona el primer elemento de ListBox pero el foco está en otro lugar.¿Cómo puedo establecer el foco en un ListBox correctamente en la carga si usa databinding?

pensé que esto podría ser debido a que se está fijando el foco antes de que los elementos de enlace de datos se cargan en ella ... pero el siguiente código muestra que efectivamente hay artículos porque ctrlItemsCount muestra el número 8.

¿Cómo puedo establecer el foco inicial en esta situación, y ¿cuál es el lugar correcto para establecer el enfoque inicial por lo general?

private void onLoad(object sender, RoutedEventArgs e) { 
     if (ctrlCountries.Items.Count > 0) { 
      ctrlItemsCount.Text = ctrlCountries.Items.Count; 
      ctrlCountries.SelectedIndex = 0; 
      FocusManager.SetFocusedElement(this, ctrlCountries); 
     } 

    } 

EDIT: he movido este código al evento cargado para el real ListBox sí. Casi funciona: el foco está ahora en el ListBox, pero aún tengo que presionar el teclado ABAJO una vez antes de que el elemento # 0 tenga el cursor del teclado. En otras palabras, el foco o cursor, es de 1 punto por encima artículo # 0 por alguna razón:

private void onCountriesLoaded(object sender, RoutedEventArgs e) { 
    ctrlCountries.SelectedIndex = 0; 
    FocusManager.SetFocusedElement(this, ctrlCountries); 
    Keyboard.Focus(); 
} 

Respuesta

10

Si desea enfocar el primer elemento en el cuadro de lista, debe establecer el foco en el primer contenedor ListBoxItem. Por ejemplo:

if (myListBox.Items.Count > 0) 
{ 
    ListBoxItem item = (ListBoxItem)myListBox.ItemContainerGenerator.ContainerFromIndex(0); 
    FocusManager.SetFocusedElement(this /* focus scope region */, item); 
} 

Usted todavía tiene que asegurarse, sin embargo, que el cuadro de lista de control ha recibido su primera Cargado evento. Hay varios otros eventos que son útiles para manejar las actualizaciones relacionadas con el elemento del cuadro de lista. Eche un vistazo al ItemContainerGenerator en MSDN.

+1

¡Funciona! Casi ... Funciona al 100% como debería si uso "Keyboard.Focus (item);" en lugar de FocusManager. Esto es extraño porque MSDN dice que el FocusManager establecerá el enfoque lógico Y tratará de establecer el foco del teclado. ¿Estoy aprendiendo la lección correcta de que Keyboard.Focus (elemento) es lo que siempre debería usar? –

2

El método FocusManager.SetFocusedElement da el foco lógico, pero no con el teclado. Puede usar el método Keyboard.Focus para enfocar el teclado en un elemento. Eche un vistazo a this page para obtener más detalles sobre la administración de foco en WPF.

+0

He añadido Keyboard.Focus (ctrlCountries); y no funciona Tenga en cuenta que si agrego un botón, haga clic en el controlador de eventos que establece el foco solo con el administrador de enfoque, funciona. –

+1

En otras palabras, el siguiente código no se centra en el primer elemento de la lista de botones: vacío privado onLoad (remitente del objeto, RoutedEventArgs e) { FocusManager.SetFocusedElement (this, ctrlCountries); Keyboard.Focus (ctrlCountries); } –

+1

Hazlo después de que ListBox esté completamente cargado (es decir, cuando se produzca el evento ctrlCountries.Loaded) –

Cuestiones relacionadas