Answers:
在XAML中:
<StackPanel FocusManager.FocusedElement="{Binding ElementName=Box}">
<TextBox Name="Box" />
</StackPanel>
到目前为止,没有人解释为什么问题中的代码行不通。我的猜测是代码被放置在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)
尝试FocusManager.SetFocusedElement
FocusManager.SetFocusedElement(parentElement, txtCompanyID)
txtCompanyID.Focusable = true;
Keyboard.Focus(txtCompanyID);
msdn:
整个桌面上只有一个具有键盘焦点的元素。在WPF中,具有键盘焦点的元素将IsKeyboardFocused设置为true。
您可以在设置行之后中断并检查IsKeyboardFocused
property 的值。还要检查您是否真的到达那条线,或者在那之后设置其他一些元素来获得焦点。
试试这个 : 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}" />
另一种可能的解决方案是使用免费的DevExpress MVVM Framework提供的FocusBehavior:
<TextBox Text="This control is focused on startup">
<dxmvvm:Interaction.Behaviors>
<dxmvvm:FocusBehavior/>
</dxmvvm:Interaction.Behaviors>
</TextBox>
它使您可以在控件加载时,引发特定事件或更改属性时集中精力。
在后面的代码中,您只能通过执行此操作来实现。
private void Window_Loaded(object sender, RoutedEventArgs e)
{
txtIndex.Focusable = true;
txtIndex.Focus();
}
注意:加载窗口之前将无法使用