将焦点设置在wpf中UserControl中的文本框控件上

时间:2013-10-07 12:52:45

标签: wpf

我创建了一个UserControl,它加载在WPF的View(Window)中。在我的用户控件中,我放了一个TextBox。当我的视图加载时,我无法将焦点设置在此文本框上。我试过以下但没有任何对我有用的东西:

  1. FocusManager.FocusedElement="{Binding ElementName=PwdBox}"

  2. 我创建了一个FocusExtension来专注于控制。

  3. 请帮忙。

7 个答案:

答案 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);