c# - usar - textbox1 focus()
Keyboard.Focus no funciona en el cuadro de texto en WPF (2)
Me estoy golpeando la cabeza con lo que parece ser un problema tan simple de solucionar en wpf, pero aún tengo que descubrir por qué no puedo hacer que mi aplicación se comporte de acuerdo con mi plan.
Tengo un pequeño cuadro de búsqueda que aparece en mi aplicación wpf cuando el usuario presiona ctrl + f. Todo lo que quiero es que el cursor esté parpadeando dentro del cuadro de texto del cuadro de búsqueda, listo para tomar cualquier entrada del usuario sin que el usuario tenga que hacer clic en él. Aquí está el código xaml para el cuadro de texto que está visible, habilitado, se puede probar, se puede tabular y se puede enfocar.
<TextBox x:Name="SearchCriteriaTextBox" Text="{Binding SearchCriteria}" Focusable="True" IsEnabled="True" IsTabStop="True" IsHitTestVisible="True" Style="{DynamicResource SearchTextBoxStyle}" Grid.Column="1" Margin="5,10,0,5" />
En el código que aparece detrás, llamo a este método cuando se ve afectada la visibilidad del cuadro de búsqueda. El cuadro de búsqueda se carga al inicio de la aplicación.
/// <summary>
/// Handles events triggered from focusing on this view.
/// </summary>
/// <param name="sender">The sender.</param>
/// <param name="dependencyPropertyChangedEventArgs">The key event args.</param>
private void OnIsVisibleChanged(object sender, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
{
if (!((bool) dependencyPropertyChangedEventArgs.NewValue))
{
return;
}
SearchCriteriaTextBox.Focus();
Keyboard.Focus(SearchCriteriaTextBox);
SearchCriteriaTextBox.Select(0, 0);
if (SearchCriteriaTextBox.Text.Length > 0)
{
SearchCriteriaTextBox.SelectAll();
}
}
El problema es que el código se llama, el componente se convierte en IsFocused = true pero no obtiene el foco del teclado. ¿Me estoy perdiendo de algo? A menos que otro control se mantenga ferozmente en el enfoque del teclado, que estoy bastante seguro de que no codifiqué, ¿por qué esta pieza de código bastante simple no funcionaría correctamente?
Como solución alternativa, podría intentar usar Dispatcher
para establecer el enfoque en una DispatcherPriority posterior, como Input
Dispatcher.BeginInvoke(DispatcherPriority.Input,
new Action(delegate() {
SearchCriteriaTextBox.Focus(); // Set Logical Focus
Keyboard.Focus(SearchCriteriaTextBox); // Set Keyboard Focus
}));
A partir de la descripción de su problema, parece que no tiene establecido el enfoque del teclado. WPF puede tener múltiples ámbitos de enfoque, por lo que múltiples elementos pueden tener enfoque lógico ( IsFocused = true
), sin embargo, solo un elemento puede tener enfoque de teclado y recibirá entrada de teclado.
El código que publicaste debe establecer el enfoque correctamente, por lo que algo debe estar ocurriendo después para mover el enfoque del teclado fuera de tu TextBox
. Al establecer el enfoque en una prioridad de despachador posterior, se asegurará de que la configuración del enfoque del teclado en su SearchCriteriaTextBox
se realice en último lugar.
Si ayuda a alguien, tuve este problema y mi aplicación tenía una ventana principal con varios controles de usuario colocados en cuadrículas separadas con un enlace de datos de visibilidad. Debido a que las cuadrículas estaban allí cuando se construyó la aplicación, se llamaría a .Focus () llamado Loaded o Constructor en el momento de la creación, no en el momento de la visibilidad.
De todos modos, lo arreglé llamando a .Focus () en el evento MouseEnter de la cuadrícula. Funciona bien para mi