Windows Phone 8: Keyboard schließen nach Enter

Ich war etwas überrascht als ich mitbekam, dass es keine Suchbox für Windows Phone gibt, immerhin ist diese ja in Windows 8 enthalten. Andererseits hatte ich mit der unter Windows 8 auch nicht so viel Spaß, da sie kein sauberes MVVM zuließ. Besonders interessant war sie eigentlich für mich auch nur deshalb, da ich nach einer Möglichkeit suchte eine Suche zu starten sobald der Nutzer die Enter Taste betätigt und zeitgleich das Keyboard zu schließen. Dazu eignet sich grundsätzlich auch eine TextBox insofern man etwas Vorarbeit leistet.

Genauer ist es notwendig, bei der TextBox auf das KeyUp Event zu lauschen und zu prüfen ob dieses ein Enter enthält. Wenn dem so ist muss man eine Aktion auslösen die das Keyboard schließt. In Meinem Fall habe ich die Eingabe kurzzeitig de- und dann wieder aktiviert. Ich bin mir nicht sicher ob dies wirklich die optimale Lösung ist aber bei mir funktioniert es zunächst ganz gut.

   private void OnKeyUp(object sender, KeyRoutedEventArgs e)
    {
        if (e.Key == VirtualKey.Enter)
        {
            CoreApplication.GetCurrentView().CoreWindow.IsInputEnabled = false;
            CoreApplication.GetCurrentView().CoreWindow.IsInputEnabled = true;
        }
    }

Da ich Code Behind bei einer Xaml-View nicht mag und ich die Funktionalität noch bei einigen anderen Views brauchte, habe ich es gleich mal in ein Behaviour gegossen:

public class CloseKeyboardBehaviour
{
    public static bool GetIsActivated(DependencyObject obj)
    {
        return (bool)obj.GetValue(IsActivatedProperty);
    }
 
    public static void SetIsActivated(DependencyObject obj, bool value)
    {
        obj.SetValue(IsActivatedProperty, value);
    }
 
    public static readonly DependencyProperty IsActivatedProperty = DependencyProperty.RegisterAttached(
        "IsActivated",
        typeof(bool),
        typeof(CloseKeyboardBehaviour),
        new PropertyMetadata(null, OnActivationChanged));
 
    private static void OnActivationChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var element = d as UIElement;
            
        if (element == null || (bool)e.NewValue != true)
        {
            return;
        }
 
        element.KeyUp += OnKeyUp;
 
    }
 
    private static void OnKeyUp(object sender, KeyRoutedEventArgs e)
    {
        if (e.Key == VirtualKey.Enter)
        {
            CoreApplication.GetCurrentView().CoreWindow.IsInputEnabled = false;
            CoreApplication.GetCurrentView().CoreWindow.IsInputEnabled = true;
        }
    }
}

Dieses muss dann nur noch an die entsprechende TextBox gehangen werden und alles sollte funktionieren:

<TextBox Text="{Binding SearchQueryText"
         Util:CloseKeyboardBehaviour.IsActivated="true" />

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

3 × vier =

Bitte folgende Aufgabe lösen um fortzufahren

Wieviel ist 11 + 14 ?
Please leave these two fields as-is: