我创建了一个UserControl
,它加载在WPF的View(Window)中。在我的用户控件中,我放了一个TextBox
。当我的视图加载时,我无法将焦点设置在此文本框上。我试过以下但没有任何对我有用的东西:
FocusManager.FocusedElement="{Binding ElementName=PwdBox}"
我创建了一个FocusExtension
来专注于控制。
请帮忙。
答案 0 :(得分:14)
这与Sheridan的答案类似,但不需要首先将焦点设置为控件。它会在控件可见时立即触发,并且基于父网格而不是文本框本身。
在'资源'部分:
<Style x:Key="FocusTextBox" TargetType="Grid">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=textBoxName, Path=IsVisible}" Value="True">
<Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=textBoxName}"/>
</DataTrigger>
</Style.Triggers>
</Style>
在我的网格定义中:
<Grid Style="{StaticResource FocusTextBox}" />
答案 1 :(得分:13)
您拥有的另一个选项是在视图模型中创建bool IsFocused
属性。然后,当此属性为DataTrigger
时,您可以添加true
来设置焦点:
在Resources
部分:
<Style x:Key="SelectedTextBoxStyle" TargetType="{x:Type TextBox}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsFocused}" Value="True">
<Setter Property="FocusManager.FocusedElement"
Value="{Binding RelativeSource={RelativeSource Self}}" />
</DataTrigger>
</Style.Triggers>
</Style>
...
<TextBox Style="{StaticResource SelectedTextBoxStyle}" ... />
请注意,有时,可能需要首先将其设置为false以使其聚焦(仅当它已经true
时):
IsFocused = false;
IsFocused = true;
答案 2 :(得分:3)
设置FocusManager.FocusedElement
属性时将设置键盘焦点。由于在初始化元素时设置了属性,因此这对于设置初始焦点通常很有用。
然而,这与设置对负载的关注并不完全相同。例如,如果它被卸载并重新加载,键盘焦点将不会第二次移动。 FocusedElement属性的实际预期用途是用于临时对焦范围(例如,当打开菜单时,窗口的FocusedElement与键盘焦点分开,因为菜单是一个单独的焦点范围 - 并且键盘焦点返回到菜单关闭时的FocusedElement)。如果在一个Window上设置FocusedElement,它将不会持续存在 - 因为Window是一个焦点范围,只要你在其中移动键盘焦点,它就会自动更新它的FocusedElement。
要关注Loaded
事件(不使用代码隐藏),此附加属性应该适用于您:
public static class FocusExtensions {
public static readonly DependencyProperty LoadedFocusedElementProperty =
DependencyProperty.RegisterAttached("LoadedFocusedElement", typeof(IInputElement), typeof(FocusExtension),
new PropertyMetadata(OnLoadedFocusedElementChanged));
public static IInputElement GetLoadedFocusedElement(DependencyObject element) {
return (IInputElement)element.GetValue(LoadedFocusedElementProperty);
}
public static void SetLoadedFocusedElement(DependencyObject element, bool value) {
element.SetValue(LoadedFocusedElementProperty, value);
}
private static void OnLoadedFocusedElementChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) {
var element = (FrameworkElement)obj;
var oldFocusedElement = (IInputElement)e.OldValue;
if (oldFocusedElement != null) {
element.Loaded -= LoadedFocusedElement_Loaded;
}
var newFocusedElement = (IInputElement)e.NewValue;
if (newFocusedElement != null) {
element.Loaded += LoadedFocusedElement_Loaded;
}
}
private static void LoadedFocusedElement_Loaded(object sender, RoutedEventArgs e) {
var element = (FrameworkElement)sender;
var focusedElement = GetLoadedFocusedElement(element);
focusedElement.Focus();
}
}
用法与FocusManager.FocusedElement
相同,即:
local:FocusExtensions.LoadedFocusedElement="{Binding ElementName=PwdBox}"
答案 3 :(得分:2)
注册UserControl的Loaded-Event,并在加载UserControl时调用Focus(),将焦点设置在PwdBox上。
public class MyUserControl : UserControl{
public MyUserControl(){
this.Loaded += Loaded;
}
public void Loaded(object sender, RoutedEventArgs e){
PwdBox.Focus();
// or FocusManager.FocusedElement = PwdBox;
}
}
答案 4 :(得分:1)
我在身份验证管理器中使用的内容:
private void SelectLogicalControl()
{
if (string.IsNullOrEmpty(TextboxUsername.Text))
TextboxUsername.Focus();
else
{
TextboxPassword.SelectAll();
TextboxPassword.Focus();
}
}
如果没有设置用户名,请关注用户名 - 文本框;否则(全选)密码箱。这是在codebehind-file中,所以不是viewmodel;)
答案 5 :(得分:0)
我只需将此属性添加到我的XAML中的开始UserControl标记:
FocusManager.FocusedElement="{Binding ElementName=DisplayName, Mode=OneTime}"
其中DisplayName是我想要获得焦点的文本框的名称。
答案 6 :(得分:0)
在加载事件中设置键盘焦点:
Keyboard.Focus(control);