如何在WPF中移动焦点?

3

我想知道在WPF中是否有任何方式可以从当前控件切换到其他控件,并移动焦点,尤其是针对已分配TabIndex的控件。

例如,我有具有TabIndex为1到5的控件,是否有办法将焦点从1跳转到5?

<TextBox TabIndex="1" Focusable = "true" LostFocus="test_LostFocus"/>
<TextBox TabIndex="2" Focusable = "true"/>
...
<TextBox TabIndex="5" Focusable = "true" name="LastControl"/>

.

private void test_LostFocus(object sender, RoutedEventArgs e)
{
  LastControl.Focus();
}

我尝试了Keyboard.Focus()FocusManager.SetFocusedElement(),但是没有成功。
有任何想法吗?

你在哪里调用 Focus 方法?你是从后台线程调用它吗? - keyboardP
你确定要使用 LostFocus 事件吗?用户可能已经从文本框点击到另一个控件上了。你是否更愿意检查用户是否按下了 tab/enter,然后只在这种情况下设置焦点? - keyboardP
我正在使用“tab”进行操作,只是为了简化问题,我省略了那部分。 - Smith
1
在这种情况下,使用 KeyDown 事件并自己处理它(如所示)。 - keyboardP
3个回答

2

如评论中所述,KeyDown是更好的方法(失去焦点会导致奇怪的行为,例如用户明确单击第二个控件,但焦点却转到最后一个控件)...

请确保将e.Handled设置为true..!

这将起作用:

private void TextBox1_KeyDown(object sender, KeyEventArgs e)
{
        if (e.Key == Key.Tab)
        {
            e.Handled = true;
            LastControl.Focus();
        }
 }

文本框的减速应该是这样的:
<TextBox TabIndex="1" Focusable = "true" KeyDown="TextBox1_KeyDown"/>

1

只需处理文本框的 KeyDown 事件并在那里设置焦点即可。由于您正在使用 Tab,请让控件知道您将处理它,方法是设置 e.Handled = true,这将停止默认的 tab 操作,即跳转到下一个 TabIndex 控件。

private void tb_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Tab)
    {
        e.Handled = true;
        LastControl.Focus();
    }
}

0

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