我编写了一个自定义控件,并希望在VisualState处于活动状态时将焦点设置在控件上。
控件是一种ComboBox,在下拉弹出窗口中有一个搜索框。当我打开它时,Opened
视觉状态变为活动状态,搜索框应该被聚焦。除了依赖属性bool IsDropDownOpen
将是true
。
PS:它是Windows 10 UWP项目。
答案 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}" ...