Domanda

Mi chiedo se qualcuno sa il motivo per cui il DatePicker passerà chiavi standard da un tasto di controllo padre giù evento indirizzato, ma non la chiave di ritorno?

Ecco il codice XAML che ho scritto:

    <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>

Ecco il codice stavo usando per verificare la chiave di ritorno:

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

Stavo usando premuto il tasto sulla incidente (lo scopo di utilizzare fino chiave) ma ho trovato interessante il fatto che la numerica standard e / caratteri sparavano la logica, ma non il tasto invio. Qualsiasi idea è il motivo per cui la chiave di ritorno non è incluso come una chiave fondamentale verso il basso?

È stato utile?

Soluzione

L'evento KeyDown è un livello inferiore evento di input del testo che potrebbero non comportarsi come previsto in alcuni controlli. Questo è perché alcuni controlli hanno il controllo compositing o classe di gestione che fornisce una versione di livello superiore di manipolazione metodo di scrittura e affini eventi.

Per quanto visualizzato su MSDN .. .il mio presupposto è che il controllo sta consumando l'evento e forse commettendo il testo alla sorgente associabile e altri pulizia e poi segna l'evento come gestito.

Altri suggerimenti

Oltre doveva parlare la mia soluzione. Ho avuto una vista padre, che gestirà l'evento keyDown da tutti ViewModel bambino. Ho dichiarato un comportamento per i controlli speciali come DatePicker, MaskedTextBox, ecc ... quell'evento cattura PreviewKeyDown tunneling e KeyDown rilancio spumeggiante evento:

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);
        }
    }
}

questo comportamento assegnato a datepicker:

<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>

che viene ascoltato dalla vista padre:

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

Codice dietro:

private void OnKeyDownHandler(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Enter)
        {
            // your code
        }
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top