Tengo un campo de búsqueda en mi aplicación WPF con un botón de búsqueda que contiene un enlace de comando. Esto funciona muy bien, pero ¿cómo puedo usar el mismo enlace de comando para el campo de texto al presionar Enter en el teclado? Los ejemplos que he visto están usando el código detrás con un manejador de eventos KeyDown. ¿Hay alguna manera inteligente de hacer que esto funcione solo con xaml y el enlace del comando?WPF: Ejecutar un Enlace de comando en un campo de búsqueda al presionar el botón Entrar
Respuesta
Usted puede utilizar la propiedad IsDefault del botón:
<Button Command="SearchCommand" IsDefault="{Binding ElementName=SearchTextBox,
Path=IsKeyboardFocused}">
Search!
</Button>
La implementación de referencia Prism contiene una implementación de lo que está buscando exactamente.
Los pasos básicos son:
- crear una clase estática enterkey
- registrada propiedad adjunta "Comando" del tipo ICommand en enterkey
- registrada propiedad adjunta "EnterKeyCommandBehavior" del tipo EnterKeyCommandBehavior en enterkey
- Cuando el valor de "Comando" cambia, adjunte "EnterKeyCommandBehavior" al control como una nueva instancia de EnterKeyCommandBehavior, y asigne ICommand a la propiedad Comando del comportamiento.
- Si el comportamiento ya ha sido fijada, utilice la instancia existente
- EnterKeyCommandBehavior acepta UIElement en el constructor y se une a la PreviewKeyDown (o KeyDown si desea permanecer Silverlight compatibles).
- En el controlador de eventos, si la clave es Enter, ejecute el ICommand (si CanExecute es verdadero).
Esto le permite utilizar el comportamiento de este modo:
<TextBox prefix:EnterKey.Command="{Binding Path=SearchCommand}" />
La respuesta aceptada sólo funciona si ya tiene una botón vinculado al comando.
Para evitar esta limitación, utilice TextBox.InputBindings:
<TextBox.InputBindings>
<KeyBinding Key="Enter" Command="{Binding Path=MyCommand}"></KeyBinding>
</TextBox.InputBindings>
Gracias por la actualización –
Esto funcionó para mí. – Garry
Además tuve que cambiar UpdateSourceTrigger en mi enlace TextBox.Text para que esto funcione. Para obtener más detalles, consulte [Capturar la tecla Intro en un cuadro de texto] (http://stackoverflow.com/a/5556526/744014). – Scott
que he probado la solución TextBox.Inputs de Greg Samson, pero tiene un error que indica que sólo podía unirse a textinputs a través de una propiedad de dependencia . Al final he encontrado la siguiente solución para esto.
Crear una clase llamada CommandReference que se parece a esto:
public class CommandReference : Freezable, ICommand
{
public CommandReference()
{
//
}
public static readonly DependencyProperty CommandProperty = DependencyProperty.Register("Command", typeof(ICommand), typeof(CommandReference), new PropertyMetadata(new PropertyChangedCallback(OnCommandChanged)));
public ICommand Command
{
get { return (ICommand)GetValue(CommandProperty); }
set { SetValue(CommandProperty, value); }
}
#region ICommand Members
public bool CanExecute(object parameter)
{
if (Command != null)
return Command.CanExecute(parameter);
return false;
}
public void Execute(object parameter)
{
Command.Execute(parameter);
}
public event EventHandler CanExecuteChanged;
private static void OnCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
CommandReference commandReference = d as CommandReference;
ICommand oldCommand = e.OldValue as ICommand;
ICommand newCommand = e.NewValue as ICommand;
if (oldCommand != null)
{
oldCommand.CanExecuteChanged -= commandReference.CanExecuteChanged;
}
if (newCommand != null)
{
newCommand.CanExecuteChanged += commandReference.CanExecuteChanged;
}
}
#endregion
#region Freezable
protected override Freezable CreateInstanceCore()
{
throw new NotImplementedException();
}
#endregion
}
en XAML añadir esto a los Recursos UserControl:
<UserControl.Resources>
<Base:CommandReference x:Key="SearchCommandRef" Command="{Binding Path = SomeCommand}"/>
El cuadro de texto actual se parece a esto:
<TextBox Text="{Binding Path=SomeText}">
<TextBox.InputBindings>
<KeyBinding Command="{StaticResource SearchCommandRef}" Key="Enter"/>
</TextBox.InputBindings>
</TextBox>
No recuerdo de dónde obtuve este código, pero este sitio lo explica también;
- 1. ArgumentOutOfRangeException en DataGridCellsPanel.BringIndexIntoView al presionar Entrar en un WPF Datagrid?
- 2. Enlace de un botón de WPF Parámetro de comando al botón en DataTemplate
- 3. Ejecutando el comando viewmodels al entrar en TextBox
- 4. Desactivar el pitido del sistema en TSpinEdit al presionar Entrar
- 5. WPF: Enlace al comando de ControlTemplate
- 6. Windows Forms: Entrar presionar tecla activa el botón de enviar?
- 7. ¿Cómo vincular el botón WPF a un comando en ViewModelBase?
- 8. Recordar ajax datos agregados al presionar el botón Atrás
- 9. Mover el foco a la siguiente celda al presionar la tecla Entrar ¿WPF DataGrid?
- 10. ¿Puede Jsoup simular presionar un botón?
- 11. Ignorando UIGestureRecognizer al presionar el botón
- 12. jqGrid: ¿Es posible confirmar un cambio de celda al tabular en lugar de presionar Entrar?
- 13. Cómo simular presionar Entrar en el texto html con Selenio?
- 14. Pérdida de memoria de enlace de comando en WPF
- 15. ¿Muestra el comando completo al ejecutar un alias de Git?
- 16. ¿Cómo puedo verificar el nuevo valor de un campo de texto al presionar una tecla?
- 17. Al presionar 'enter' en un tipo de entrada = "texto", ¿cómo?
- 18. ¿Cómo desactivar el pitido al presionar ENTRAR en un control de EDIT de línea única bajo Windows CE?
- 19. Entrar no envía formulario en IE debido al botón oculto
- 20. Detener el 'Ding' al presionar Enter
- 21. Cerrar un cuadro de diálogo al presionar Enter
- 22. Cómo devolver el valor en un campo según el valor de búsqueda en otro campo
- 23. Elija el botón mientras presiona el botón Entrar
- 24. ¿Cómo mostrar un teclado a través de presionar un NSButton?
- 25. ¿Cómo denegar el apagado al presionar el botón de encendido por un tiempo?
- 26. Manejo del botón ENTRAR en TextBox, ASP.NET
- 27. Cerrar la aplicación al presionar el botón Atrás en Android
- 28. Enlazar un atajo de teclado a un comando en el modelo de vista en WPF
- 29. oyente para presionar y soltar un botón
- 30. Enlace a un comando en una cuadrícula de datos
Gracias, fácil y limpio. ¡Funciona genial! –
¡Gracias por esto! – abramlimpin
¿Qué sucede si no tiene un botón? – ihake