2010-12-30 9 views
2

Ich frage mich, ob jemand weiß, warum der Datepicker Standard-Schlüssel an alle Schlüssel übergeben Down-Routing-Ereignis, aber nicht die Return-Taste?Warum isst der Wpftoolkit-Datapicker das Return-Key-Down-Event?

hier ist die XAML i schrieb:

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

Hier ist der Code, den ich für die Return-Taste zu überprüfen, wurde mit:

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

I-Taste nach unten auf Unfall mit wurde (gemeint Schlüssel verwenden up), aber ich fand es interessant, dass die Standard-Numerik und/-Zeichen die Logik feuern, aber nicht die Return-Taste. Irgendwelche Ideen, warum der Return-Key nicht als Key-Down-Taste enthalten ist?

Antwort

3

Das KeyDown-Ereignis ist ein niedrigere Ebene Texteingabeereignis, das nicht auf bestimmte Kontrollen wie erwartet verhalten könnte. Diese ist, weil einige Steuerelemente Steuerelement Compositing oder Klassenbehandlung, die bietet eine höhere Version von Texteingabe Handhabung und verwandte Ereignisse.

Wie auf MSDN angesehen ... meine Vermutung ist, dass die Steuerung das Ereignis verbraucht und vielleicht den Text in die bindungsfähige Quelle und andere Bereinigungen zu begehen und dann markiert das Ereignis als behandelt.

+0

sehr interessant ... Ich denke, es hat wahrscheinlich zu tun mit der Kalendersteuerung Teil der Datumsauswahl ist die Handhabung des ausgewähltenDate-Wert, um den Text in das Textfeld zu setzen. aber würden sie nicht zulassen wollen, dass das Event für eine mögliche Nutzung aufbläht? –

+0

@ N8 Nicht unbedingt, da es sich um ein spezifisches Steuerelement handelt, das eine bestimmte Funktionalität bereitstellt; im Gegensatz zu einem Rahmenwerk, das auf die Bereitstellung/Ermöglichung von Erweiterbarkeit ausgerichtet ist. –

+0

Ah, wie wenn das Ereignis ausgelöst wird, ist der gesamte zusammengesetzte Steuerstatus in einem volatilen Zustand. (AKA gebundene Werte könnten die Hälfte getan Bindung oder etwas in der Art sein. aber würden sie nicht mit dem Ereignis umgehen wollen, bekommen ihre Kontrolle (in diesem Fall die Datumsauswahl) in einen festen Zustand, dann das Ereignis erneut auslösen? hoffe, dass das Sinn macht (und danke nochmal, ich würde dir mehr Stimmen geben, wenn ich könnte!) –

0

Dazu musste ich meine Lösung erwähnen. Ich hatte eine Elternansicht, die das keyDown-Ereignis von allen untergeordneten Ansichtsmodellen behandelt. ich ein Verhalten für spezielle Kontrollen wie Datepicker erklärt, MaskedTextBox, etc ..., dass Tunnel Ereignis fängt PreviewKeyDown und heben KeyDown- sprudelndes Ereignis:

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

dieses Verhalten zu picker zugewiesen:

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

das ist von übergeordneter Ansicht gehört:

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

-Code hinter:

private void OnKeyDownHandler(object sender, KeyEventArgs e) 
    { 
     if (e.Key == Key.Enter) 
     { 
      // your code 
     } 
    }