【发布时间】:2010-11-23 15:25:02
【问题描述】:
如何在 WPF 中将焦点设置在 TextBox 元素上
我有这个代码:
txtCompanyID.Focusable = true;
txtCompanyID.Focus();
...但它不起作用。
有什么想法吗?
【问题讨论】:
-
txtCompanyID.Focusable = true; Keyboard.Focus(txtCompanyID);它有效,但就是这样。
如何在 WPF 中将焦点设置在 TextBox 元素上
我有这个代码:
txtCompanyID.Focusable = true;
txtCompanyID.Focus();
...但它不起作用。
有什么想法吗?
【问题讨论】:
试试FocusManager.SetFocusedElement
FocusManager.SetFocusedElement(parentElement, txtCompanyID)
【讨论】:
txtCompanyID.Focusable = true;
Keyboard.Focus(txtCompanyID);
msdn:
上只能有一个元素 具有键盘焦点的整个桌面。 在 WPF 中,有键盘的元素 焦点将设置 IsKeyboardFocused 为真。
您可以在设置行之后中断并检查IsKeyboardFocused 属性的值。还要检查你是否真的到达了那条线,或者你是否设置了一些其他元素来获得焦点。
【讨论】:
在 XAML 中:
<StackPanel FocusManager.FocusedElement="{Binding ElementName=Box}">
<TextBox Name="Box" />
</StackPanel>
【讨论】:
试试这个: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的构造函数中。但此时确定重点还为时过早。一旦窗口准备好进行交互,就必须这样做。代码最好的地方是Loaded事件:
public KonsoleWindow() {
public TestWindow() {
InitializeComponent();
Loaded += TestWindow_Loaded;
}
private void TestWindow_Loaded(object sender, RoutedEventArgs e) {
txtCompanyID.Focus();
}
}
【讨论】:
Focus() 需要焦点状态参数 - 例如txtCompanyId.Focus(FocusState.Keyboard)
另一种可能的解决方案是使用free DevExpress MVVM Framework提供的FocusBehavior:
<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() 的调用。
【讨论】:
在后面的代码中,你只能通过这样做来实现它。
private void Window_Loaded(object sender, RoutedEventArgs e)
{
txtIndex.Focusable = true;
txtIndex.Focus();
}
注意:在加载窗口之前它不会工作
【讨论】: