WPF/C#中文本框的光标聚焦问题

21

我目前正在创建一个屏幕键盘。我使用路由命令处理按钮点击。问题是当我在键盘面板上点击按钮时,焦点会转移到按钮上而不是文本框。需求要求光标始终出现在文本框中,以指示下一个字符插入的位置。有没有办法在点击按钮时保持文本框的焦点。

8个回答

36

要将逻辑焦点设置到输入控件上

FocusManager.SetFocusedElement(this, textboxJack);     // set logical focus

设置输入控件的键盘焦点

Keyboard.Focus(textboxJill);                             // set keyboard focus
了解逻辑焦点和键盘焦点的区别。

MSDN上的输入概述-焦点


12

获取特定控件(在这种情况下为TextBox)的引用。单击后,在Button_Click方法中粘贴以下内容:

Dispatcher.BeginInvoke((ThreadStart)delegate
            {
                control.Focus();
            });

1
为什么这个能工作而其他的不能?我们不是已经在UI线程上了吗?为什么还需要委托? - tataelm

8

我喜欢这些关于“帮我做作业”的问题,“要求说明”……无价。对于那些通过谷歌找到这篇文章的人,WPF文本框中编程移动光标的技巧是使用SelectionStart属性。

private void Button_Click(object sender, RoutedEventArgs e)
{
    textBox.Focus();
    textBox.SelectionStart = textName.Text.Length;
}

39
这不是一个“替我写作业”的问题,而是一个“我正在做作业,但卡住了,能否给我一些指引”的问题。 - Jacques Bosch

3
Textbox.Focus();

这将会聚焦于文本框。


2
您可以通过使用单独的焦点范围来解决“键盘”问题。只需将以下属性应用于包含所有按钮的控件,然后它们将位于单独的焦点范围内,并且在单击时不会将焦点设置为它们。
FocusManager.IsFocusScope="True"

2

我解决这个问题的方法是将键盘上所有的按钮/控件设置为focusable=false。这样,您就不会失去当前控件的焦点。


这是一种更好的方法,但它会将光标位置设置回文本框的开头。 - Ehsan Shoja

1

我想做同样的事情,但似乎没有任何方法适用于我。因为我正在使用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}" />

1

我不得不使用这个才能得到我想要的结果

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 }
);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接