wpf 在失去焦点时禁用

wpf disable on lost focus

我有一个简单的 wpf 应用程序,它包含 3 个文本框(tx1、tx2 和 tx3)。

根据 tx1 的内容,我想禁用 tx2 或 tx3。 我在 tx1_LostFocus 中执行此检查并将 tx2.IsEnabled 或 tx3.IsEnabled 设置为 False。

当禁用 tx3 一切正常时,光标转到 tx2。

但是禁用 tx2 导致在 tx3 中看不到我的光标,它根本不可见。

我认为问题的核心是在tx1_LostFocus中设置tx2.IsEnabled = False。

但是我在失去焦点事件中被迫这样做。

有线索吗?

当您需要将光标聚焦在 tx1_LostFocus 末尾时使用 tx3.Focus();。 如果 tx3 被禁用,请不要忘记启用 tx2,反之亦然。

所以我做了一些快速测试,看起来控件即使未启用也可以接收焦点。我在 textOneLostFocus 事件处理程序中添加了这些行:

Debug.Print(b.Name + " lost focus.");
Debug.Print("Disabling " + this.textTwo.Name);

textTwo

GotFocus 事件处理程序中的这一行
Debug.Print("Enabling " + this.textTwo.Name);

您可以在输出 window 中看到,当我从 textOne 跳出时 textTwo 确实获得了焦点,即使它已被禁用:

textOne lost focus.

Disabling textTwo

textTwo got focus.

我认为最好的解决办法是在禁用控件后手动设置焦点。像这样:

if (testCondition)
{
    tx2.IsEnabled = false;
    tx3.Focus();
}
else
{
    tx3.IsEnabled = false;
    tx2.Focus();
}

更好的解决方案

我更喜欢这个解决方案,因为它不脆。如果您重新排序控件或更改条件逻辑,它不会引入奇怪的 Tab 键行为。在 tx2GotFocus 事件处理程序中,如果 tx2 被禁用,您可以添加此代码以强制焦点移动到下一个控件:

if (!tx2.IsEnabled)
{
    tx2.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
};