Pregunta

Me pregunto si alguien sabe por qué el selector de fechas pasará teclas estándar para cualquier clave de control principal evento enrutado hacia abajo, pero no la tecla de retorno?

aquí está la xaml i escribió:

    <WrapPanel Name="_wpParameters" 
               Grid.Row="0" Grid.Column="0" 
               Orientation="Horizontal" 
               Grid.IsSharedSizeScope="True"
               Keyboard.KeyDown="_wpParameters_KeyDown" >
        <!-- this is where the dynamic parameter controls will be added -->
    </WrapPanel>

Aquí está el código que estaba usando para comprobar si la tecla de retorno:

private void _wpParameters_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Return)
    {
        RaiseEvent(new RoutedEventArgs(LoadLiveResultsEvent, this));
    }
}

Yo estaba usando tecla reducir accidentes (con la intención de utilizar tecla de aumento), pero me pareció interesante que el numérico estándar y / caracteres estaban disparando la lógica, pero no la tecla de retorno. Cualquier idea es la razón por la tecla de retorno no se incluye como una tecla pulsada la tecla?

¿Fue útil?

Solución

El evento KeyDown es una de menor nivel evento de entrada de texto que no se comporte como se esperaba en ciertos controles. Esta es debido a que algunos controles tienen el control de composición o una clase de manejo de ese proporciona una versión de mayor nivel de la manipulación de entrada de texto y relacionados eventos.

Como se ve en la MSDN .. .my suposición es que el control está consumiendo el evento y quizás cometer el texto a la fuente enlazable y otra limpieza y luego marcar el evento como manejada.

Otros consejos

Además tuvo que mencionar mi solución. Yo tenía una vista de los padres, que controlen el evento keyDown de todos ViewModels niño. Declaré un comportamiento de controles especiales como DatePicker, MaskedTextBox, etc ... ese evento captura PreviewKeyDown túneles y aumento KeyDown burbujeo de eventos:

public class EnterPressedBehavior : Behavior<UIElement>
{
    public ICommand EnterPressedCommand { get; private set; }

    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.PreviewKeyDown += EnterPressed;
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
        AssociatedObject.PreviewKeyDown -= EnterPressed;
    }

    private void EnterPressed(object sender, KeyEventArgs keyEventArgs)
    {
        if (Keyboard.PrimaryDevice != null && Keyboard.PrimaryDevice.ActiveSource != null)
        {
            var eventArgs = new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, 0, keyEventArgs.Key) { RoutedEvent = UIElement.KeyDownEvent };

            AssociatedObject.RaiseEvent(eventArgs);
        }
    }
}

este comportamiento asignado al selector de fechas:

<DatePicker x:Name="BirthDateDatePicker" Grid.Column="1"
                    Grid.Row="6" Margin="3" HorizontalAlignment="Stretch"                                              
                    IsEnabled="{Binding PersonFieldsEditDenied}"
                    Validation.ErrorTemplate="{StaticResource DefaultValidationTemplate}"
                    AutomationProperties.AutomationId="BirthDateDatePicker">
            <i:Interaction.Behaviors>
                <viewModels:EnterPressedBehavior />
            </i:Interaction.Behaviors>
</DatePicker>

que se escuchó por vista padre:

<Window
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       Title=""
       KeyDown="OnKeyDownHandler">

Código atrás:

private void OnKeyDownHandler(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Enter)
        {
            // your code
        }
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top