2016-03-26 16 views
0

Ich schreibe ein benutzerdefiniertes Steuerelement und möchte den Fokus auf ein Steuerelement festlegen, falls ein VisualState aktiv wird.Set Fokus in VisualStatemanager

Das Steuerelement ist eine Art ComboBox mit einem Suchfeld im Dropdown-Popup. Wenn ich es öffne, wird der visuelle Zustand Opened aktiv und das Suchfeld sollte fokussiert sein. Neben einer Abhängigkeitseigenschaft wird bool IsDropDownOpentrue sein.

PS: Es ist ein Windows 10 UWP-Projekt.

Antwort

1

Sorry, aber Sie können nur programmatisch Fokus gesetzt, nicht durch visuellen Zustand :(

+0

Das ist ärgerlich. Weißt du, ob es möglich ist, eine benutzerdefinierte Animation in UWP zu erstellen? Ich kann von 'TimeLine' oder' ObjectKeyFrame' ableiten, aber es gibt nichts, um einen Wert wie 'GetCurrentValue' in WPF zu animieren. – Koopakiller

+0

Sorry, aber ich habe WPF nie versucht ... Was willst du animieren? –

+0

In WPF können Sie eine benutzerdefinierte Animation erstellen. So können Sie den Fokus zu einem bestimmten Zeitpunkt auf ein bestimmtes Steuerelement setzen. Aber ich weiß nicht, ob es auch in UWP möglich ist. – Koopakiller

1

Nicht meine Liebling Lösung, aber eine Behelfslösung, ohne hinter den TextBox von Code zugreifen.

ich eine angefügte Eigenschaft implementiert, setzt den Fokus auf ein Steuerelement, falls die Eigenschaft auf true gesetzt.

public class FocusHelper : DependencyObject 
{ 
    #region Attached Properties 

    public static readonly DependencyProperty IsFocusedProperty = DependencyProperty.RegisterAttached("IsFocused", typeof(bool), typeof(FocusHelper), new PropertyMetadata(default(bool), OnIsFocusedChanged)); 

    public static bool GetIsFocused(DependencyObject obj) 
    { 
     return (bool)obj.GetValue(IsFocusedProperty); 
    } 

    public static void SetIsFocused(DependencyObject obj, bool value) 
    { 
     obj.SetValue(IsFocusedProperty, value); 
    } 

    #endregion 

    #region Methods 

    public static void OnIsFocusedChanged(DependencyObject s, DependencyPropertyChangedEventArgs e) 
    { 
     var ctrl = s as Control; 
     if (ctrl == null) 
     { 
      throw new ArgumentException(); 
     } 

     if ((bool)e.NewValue) 
     { 
      ctrl.Focus(FocusState.Keyboard); 
     } 
    } 

    #endregion 
} 

So kann ich diese eigenschaft auf meine IsDropDownOpen Eigenschaft binden. So öffnen jedes Mal, wenn ich th e Drop-Down, der TextBox wird den Fokus bekommen.

<TextBox helper:FocusHelper.IsFocused="{Binding IsDropDownOpen, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}" ...