在VisualStatemanager中设置Focus

时间:2016-03-26 14:43:03

标签: c# xaml winrt-xaml win-universal-app

我编写了一个自定义控件,并希望在VisualState处于活动状态时将焦点设置在控件上。

控件是一种ComboBox,在下拉弹出窗口中有一个搜索框。当我打开它时,Opened视觉状态变为活动状态,搜索框应该被聚焦。除了依赖属性bool IsDropDownOpen将是true

PS:它是Windows 10 UWP项目。

2 个答案:

答案 0 :(得分:1)

抱歉,您只能通过编程方式设置焦点,而不是通过视觉状态:(

答案 1 :(得分:1)

不是我最喜欢的解决方案,但是没有从后面的代码访问TextBox的解决方法。

我实现了一个附加属性,在属性设置为true时将焦点设置为控件。

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
}

所以我可以将此属性绑定到我的IsDropDownOpen属性。因此,每次打开下拉列表时,TextBox都会得到焦点。

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