如何在 WPF 中设置 TextBox元素的焦点
TextBox
我有这个密码:
txtCompanyID.Focusable = true; txtCompanyID.Focus();
但是没有用。
知道吗?
试试 元素
FocusManager.SetFocusedElement(parentElement, txtCompanyID)
txtCompanyID.Focusable = true; Keyboard.Focus(txtCompanyID);
Msdn:
上只能有一个元素 有键盘焦点的整个桌面。 在 WPF 中,具有键盘的元素 Focus 将设置为 IsKeyboardFocus 真实。
您可以在设置行之后中断并检查 IsKeyboardFocused属性的值。还要检查你是否真的到达了那条线,或者你设置了其他的元素来获得焦点。
IsKeyboardFocused
在 XAML 中:
<StackPanel FocusManager.FocusedElement="{Binding ElementName=Box}"> <TextBox Name="Box" /> </StackPanel>
试试这个: MyTextBox.Focus ( );
MyTextBox.Focus ( );
这些都不适合我,因为我使用的是网格而不是 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}" />
到目前为止还没有人解释为什么问题中的代码不能工作。我猜测代码被放置在 Window 的构造函数中。但现在确定焦点还为时过早。一旦窗口准备好进行交互,就必须这样做。代码的最佳位置是 Loadedevent:
public KonsoleWindow() { public TestWindow() { InitializeComponent(); Loaded += TestWindow_Loaded; } private void TestWindow_Loaded(object sender, RoutedEventArgs e) { txtCompanyID.Focus(); } }
另一种可能的解决方案是使用 免费的 DevExpress MVVM 框架提供的 焦点行为:
<TextBox Text="This control is focused on startup"> <dxmvvm:Interaction.Behaviors> <dxmvvm:FocusBehavior/> </dxmvvm:Interaction.Behaviors> </TextBox>
它允许您在加载控件、引发某个事件或更改某个属性时聚焦该控件。
如果你还没有找到其他答案的解决方案,这就是我解决这个问题的方法。
Application.Current.Dispatcher.BeginInvoke(new Action(() => { TEXTBOX_OBJECT.Focus(); }), System.Windows.Threading.DispatcherPriority.Render);
据我所知,其他解决方案可能不起作用,因为在应用程序呈现其他组件之前调用了对 Focus()的调用。
Focus()
在代码后面,您只能通过这样做来实现它。
private void Window_Loaded(object sender, RoutedEventArgs e) { txtIndex.Focusable = true; txtIndex.Focus(); }
注意: 在加载窗口之前它不会工作