我目前正在创建一个屏幕键盘。我使用路由命令处理按钮点击。问题是当我在键盘面板上点击按钮时,焦点会转移到按钮上而不是文本框。需求要求光标始终出现在文本框中,以指示下一个字符插入的位置。有没有办法在点击按钮时保持文本框的焦点。
要将逻辑焦点设置到输入控件上
FocusManager.SetFocusedElement(this, textboxJack); // set logical focus
设置输入控件的键盘焦点
Keyboard.Focus(textboxJill); // set keyboard focus
了解逻辑焦点和键盘焦点的区别。
获取特定控件(在这种情况下为TextBox)的引用。单击后,在Button_Click方法中粘贴以下内容:
Dispatcher.BeginInvoke((ThreadStart)delegate
{
control.Focus();
});
我喜欢这些关于“帮我做作业”的问题,“要求说明”……无价。对于那些通过谷歌找到这篇文章的人,WPF文本框中编程移动光标的技巧是使用SelectionStart属性。
private void Button_Click(object sender, RoutedEventArgs e)
{
textBox.Focus();
textBox.SelectionStart = textName.Text.Length;
}
Textbox.Focus();
这将会聚焦于文本框。
FocusManager.IsFocusScope="True"
我解决这个问题的方法是将键盘上所有的按钮/控件设置为focusable=false
。这样,您就不会失去当前控件的焦点。
我想做同样的事情,但似乎没有任何方法适用于我。因为我正在使用MVVM模式,所以我真的需要一个纯粹基于XAML的解决方案。
最终我找到了这个例子: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}" />
我不得不使用这个才能得到我想要的结果
FocusManager.SetFocusedElement(this, UserNameautoCompleteBox);
Key key = Key.Enter; // Key to send
var target = Keyboard.FocusedElement; // Target element
RoutedEvent routedEvent = Keyboard.KeyDownEvent; // Event to send
target.RaiseEvent(
new KeyEventArgs(
Keyboard.PrimaryDevice,
PresentationSource.FromVisual(UserNameautoCompleteBox),
0,
key) { RoutedEvent = routedEvent }
);