我有一个简单的wpf应用程序,它包含3个文本框(tx1,tx2和tx3)。
根据tx1的内容,我想禁用tx2或tx3。 我这样做检查tx1_LostFocus并将tx2.IsEnabled或tx3.IsEnabled设置为False。
禁用tx3时,一切正常,光标转到tx2。
但禁用tx2会导致我的光标无法在tx3中看到,但它根本不可见。
我认为问题的核心是在tx1_LostFocus中设置tx2.IsEnabled = False。
但我在失焦的事件中被迫这样做。
有任何线索吗?
答案 0 :(得分:1)
所以我做了一些快速测试,看起来控件即使没有启用也能获得焦点。我在LostFocus
的{{1}}事件处理程序中添加了这些行:
textOne
此Debug.Print(b.Name + " lost focus.");
Debug.Print("Disabling " + this.textTwo.Name);
GotFocus
事件处理程序中的这一行
textTwo
您可以在输出窗口中看到,当我Debug.Print("Enabling " + this.textTwo.Name);
textOne
标签突出时,即使它被禁用,也会立即获得焦点:
textOne失去了焦点。
禁用textTwo
textTwo得到了关注。
我认为最好的解决方案是在禁用控件后手动设置焦点。像这样:
textTwo
我更喜欢这种解决方案,因为它不易碎。如果重新排序控件或更改条件逻辑,则不会引入奇怪的标签行为。在if (testCondition)
{
tx2.IsEnabled = false;
tx3.Focus();
}
else
{
tx3.IsEnabled = false;
tx2.Focus();
}
的{{1}}事件处理程序中,如果禁用GotFocus
,您可以添加此代码以强制焦点移至下一个控件:
tx2
答案 1 :(得分:0)
当需要在tx1_LostFocus的末尾将光标聚焦在其上时,请使用tx3.Focus();
。
如果禁用tx3,请不要忘记启用tx2,反之亦然。