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();
}
¡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? –