2016-03-21 16 views
0

Ich bin nicht sehr Erfahrung mit Verhalten, aber bis jetzt haben sie sich als praktisch, in der Lage sein, Code aus dem ViewModel ausführen, aber immer noch die Aktionen aus dem View auslösen.Binding FocusAction Verhalten auf Knopfdruck

In meinem aktuellen Szenario habe ich eine TextBox, die angezeigt wird, wenn ein Button geklickt wird. Ich möchte dann den Fokus darauf setzen TextBoxnach der Button wurde geklickt.

Früher konnte ich den Fokus mit Hilfe eines EventTriggerBehavior wie so einzustellen:

<core:EventTriggerBehavior> 
    <behaviors:FocusAction /> 
</core:EventTriggerBehavior> 

Dies wird jedoch nur genügen, wenn ich den Fokus dieser Kontrolle gesetzt werden soll, wenn die View geladen wird. In diesem Fall ist der TextBox zu diesem Zeitpunkt nicht sichtbar, und tatsächlich geht der Fokus zunächst auf einen anderen TextBox.

Gibt es eine Möglichkeit, den Fokus eines Steuerelements von ViewModel zu setzen? Dies ist eine WinRT 8.1-Anwendung, wird aber in Zukunft auf Windows 10 Universal portiert.

EDIT

Die Antwort here sieht aus wie es tun würde, was ich suche, aber wenn ich es versuchen, bekomme ich einen Fehler:

Cannot resolve symbol 'UIPropertyMetadata'

Von dem, was ich sagen kann, dass class existiert im System.Windows Namensraum, aber selbst mit einem using System.Windows; bekomme ich immer noch den gleichen Fehler. Ich habe auch versucht new System.Windows.UIPropertyMetadata(null, ElementToFocusPropertyChanged), aber das macht auch keinen Unterschied. Ist diese Klasse in WinRT nicht verfügbar?

Antwort

0

Ich konnte es zur Arbeit bringen, indem ich die Antwort, die mit meiner ursprünglichen Frage verbunden ist, leicht änderte. Für alle, die dies in einer WinRT Anwendung zu erreichen, hier ist der modifizierte Code:

public class EventFocusAttachment 
{ 
    public static Control GetElementToFocus(Button button) 
    { 
     return (Control)button.GetValue(ElementToFocusProperty); 
    } 

    public static void SetElementToFocus(Button button, Control value) 
    { 
     button.SetValue(ElementToFocusProperty, value); 
    } 

    public static readonly DependencyProperty ElementToFocusProperty = 
     DependencyProperty.RegisterAttached("ElementToFocus", typeof(Control), 
     typeof(EventFocusAttachment), new PropertyMetadata(null, ElementToFocusPropertyChanged)); 

    public static void ElementToFocusPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
    { 
     var button = sender as Button; 
     if (button != null) 
     { 
      button.Click += async (s, args) => 
      { 
       var control = GetElementToFocus(button); 
       if (control != null) 
       { 
        await Task.Delay(100); 
        control.Focus(FocusState.Programmatic); 
       } 
      }; 
     } 
    } 
} 

ich eine kleine Verzögerung hinzuzufügen hatte, weil die TextBox, die ich auf mich konzentriere nicht sichtbar ist, bis die Taste gedrückt wird, so es funktionierte nicht ohne die Verzögerung. Außerdem musste ich die UIPropertyMetadata einfach in PropertyMetadata ändern und async zum Lambda-Ausdruck hinzufügen, um die await Task.Delay(100);

zu ermöglichen