Silverlight Timer Default-Button versteckte Emulator-Features (Teil 2)
Kommentare

Menü 2 für Experten: Default-Button setzen
Es ist Gang und Gäbe, dass z. B. beim Ausfüllen eines Formulars nur die ENTER-Taste gedrückt werden muss, um eine bestimmte Aktion auszulösen. Bedauerlicherweise

Menü 2 für Experten: Default-Button setzen

Es ist Gang und Gäbe, dass z. B. beim Ausfüllen eines Formulars nur die ENTER-Taste gedrückt werden muss, um eine bestimmte Aktion auszulösen. Bedauerlicherweise gibt es für ein Button-Steuerelement unter Silverlight keine „Default Button“-Funktion. Zum Glück bieten sich  allerdings gleich mehrere Lösungswege an, um das Problem zu lösen. Die effektivste und MVVM-freundlichste Lösung wäre das CallMethodAction-Behavior, das von Expression Blend 4 für WPF 4 und Silverlight 4 zur Verfügung steht. Hier muss nur der TriggerType unter den Eigenschaften des Behaviors zu KeyTrigger gewechselt und ENTER als Key gewählt werden.

Wenn allerdings kein Expression Blend 4 vorhanden ist oder es sich um eine niedrigere Silverlight-Version handelt, muss ein eigener DefaultButtonService geschrieben werden. Einen solchen hat Patrick Cauldwell auf seinem Blog (Listing 2). Listing 3 veranschaulicht, wie der DefaultButtonService im XAML zum Einsatz kommt. Dazu ist eine TextBox mit einem Button verknüpft. Die TextBox bekommt den Service mittels Attached Properties, womit der Name des Hauptbuttons durch einen String bekanntgegeben wird. Beim Auslösen der ENTER-Taste wird der Button vom Service gefeuert.

Listing 2: „DefaultButtonService“-Klasse

public static class DefaultButtonService
{
    public static readonly DependencyProperty DefaultButtonProperty =
        DependencyProperty.RegisterAttached("DefaultButton", typeof(string), typeof(DefaultButtonService), new PropertyMetadata(OnDefaultButtonChanged));

    public static string GetDefaultButton(DependencyObject d)
    {
        return (string)d.GetValue(DefaultButtonProperty);
    }

    public static void SetDefaultButton(DependencyObject d, string value)
    {
        d.SetValue(DefaultButtonProperty, value);
    }

    private static void OnDefaultButtonChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        TextBox textBox = d as TextBox;

        if (textBox != null)
            textBox.KeyUp += TextBlockKeyUp;
    }

    private static void TextBlockKeyUp(object sender, KeyEventArgs e)
    {
        switch (e.Key)
        {
            case Key.Enter:
                string name = (string)((DependencyObject)sender).GetValue(DefaultButtonProperty);
                object root = App.Current.RootVisual;
                object button = ((FrameworkElement)root).FindName(name);
                
                if (button is Button)
                {
                    ButtonAutomationPeer peer = new ButtonAutomationPeer((Button)button);
                    IInvokeProvider ip = peer;
                    ip.Invoke();
                }
                break;
        }
    }
}  

Listing 3: XAML-Deklaration mit der Verwendung vom „DefaultButtonService“


  
      
      
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -