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,反之亦然。
所以我做了一些快速测试,看起来控件即使未启用也可以接收焦点。我在 textOne
的 LostFocus
事件处理程序中添加了这些行:
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 键行为。在 tx2
的 GotFocus
事件处理程序中,如果 tx2
被禁用,您可以添加此代码以强制焦点移动到下一个控件:
if (!tx2.IsEnabled)
{
tx2.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
};
我有一个简单的 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,反之亦然。
所以我做了一些快速测试,看起来控件即使未启用也可以接收焦点。我在 textOne
的 LostFocus
事件处理程序中添加了这些行:
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 键行为。在 tx2
的 GotFocus
事件处理程序中,如果 tx2
被禁用,您可以添加此代码以强制焦点移动到下一个控件:
if (!tx2.IsEnabled)
{
tx2.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
};