在WPF中将焦点放在文本框上


105

如何TextBox在WPF 中将焦点设置为元素

我有这个代码:

txtCompanyID.Focusable = true;
txtCompanyID.Focus();

...但是它不起作用。

任何想法?


txtCompanyID.Focusable = true; Keyboard.Focus(txtCompanyID); 它有效,但这就是方法。
MindRoasterMir

Answers:


145

在XAML中:

<StackPanel FocusManager.FocusedElement="{Binding ElementName=Box}">
   <TextBox Name="Box" />
</StackPanel>

9
与上面的其他方法相比,我更喜欢这种方法,因为它与MVVM保持一致。
Todd Sprang 2014年

1
焦点元素是只读权限,如何在xaml中设置?我使用了它,但不起作用<Style.Triggers> <Trigger Property =“ Validation.HasError” Value =“ True”> <Setter Property =“ FocusManager.FocusedElement” Value =“ {Binding Source = {RelativeSource Self}}”“ /> </ Trigger> </Style.Triggers>
WPFKK

@ user841612,查看以下链接并确认大会和命名空间msdn.microsoft.com/en-us/library/...
usefulBee

这仅工作一次。如果要在构建页面后更改焦点,则需要以编程方式进行。
乔·斯蒂尔

这也可以。txtCompanyID.Focusable = true; Keyboard.Focus(txtCompanyID);
MindRoasterMir

51

到目前为止,没有人解释为什么问题中的代码行不通。我的猜测是代码被放置在Window的构造函数中。但是,现在确定焦点还为时过早。一旦窗口准备好进行交互,就必须完成此操作。代码的最佳位置是Loaded事件:

public KonsoleWindow() {
  public TestWindow() {
    InitializeComponent();
    Loaded += TestWindow_Loaded;
  }

  private void TestWindow_Loaded(object sender, RoutedEventArgs e) {
    txtCompanyID.Focus();
  }
}

1
从逻辑上讲是正确的,经过太多的努力后,这个答案可以很好地解决。
shivani

这对我有用。接受的答案没有。谢谢
BoundForGlory

不确定是否特定于版本,但Focus()需要焦点状态参数-例如txtCompanyId.Focus(FocusState.Keyboard)
Dan


26
txtCompanyID.Focusable = true;
Keyboard.Focus(txtCompanyID);

msdn:

整个桌面上只有一个具有键盘焦点的元素。在WPF中,具有键盘焦点的元素将IsKeyboardFocused设置为true。

您可以在设置行之后中断并检查IsKeyboardFocusedproperty 的值。还要检查您是否真的到达那条线,或者在那之后设置其他一些元素来获得焦点。


19

试试这个 : MyTextBox.Focus ( );


2
这是最优雅的答案,它也不需要您指定父项。谢谢你,它对我来说很棒!
dbeachy1 2015年

彼得·胡伯(Peter Huber)的回答做到了这一点,但解释了该窗口需要首先加载,这就是为什么我的窗口无法工作的原因
Adriaan Davel

14

当我使用网格而不是StackPanel时,这些都不对我有用。

我终于找到了这个例子:http : //spin.atomicobject.com/2013/03/06/xaml-wpf-textbox-focus/

并将其修改为:

在“资源”部分:

    <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}" />

2
这也为我工作。其余的不是。感谢您的链接,这很有趣。同样有趣的是,如此简单的事情可能是如此复杂。
TravisWhidden

2
无论容器是Gird还是StackPanel,以上答案都可以正常工作。由于网格的结构不清楚,因此很难说出可能出了什么问题。很高兴看到替代品。
有用蜜蜂

1
对我来说,这也是唯一可以正常工作的人。好方法
OregonGhost

7

如果您还没有找到其他答案的解决方案,这就是我解决问题的方法。

Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
    TEXTBOX_OBJECT.Focus();
}), System.Windows.Threading.DispatcherPriority.Render);

据我了解,其他解决方案可能无法正常工作,因为对的调用Focus()是在应用程序呈现其他组件之前调用的。


3
这个答案值得一个更好的排名。
西蒙·穆里尔


0

在后面的代码中,您只能通过执行此操作来实现。

 private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            txtIndex.Focusable = true;
            txtIndex.Focus();
        }

注意:加载窗口之前将无法使用

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.