UI问题 - 控制控制状态和焦点

时间:2009-12-21 05:04:05

标签: c# .net-2.0 controls focus state

在开发.NET Windows窗体应用程序时,我遇到了一些僵局。问题与在控件之间切换焦点以及如何保持窗体控件的状态有关。

UI中有三个主要控件 - 两个组合框和一个按钮。

  • 两个组合框都以SelectedItem = null开头。
  • 两个组合框都有一组明确的有效选项可供选择。
  • 两个组合框都使用AutoCompleteMode.SuggestAppendAutoCompleteSource设置为AutoCompleteSource.ListItems。这意味着用户可以输入组合框并弹出建议值以供选择。
  • ComboBox#1始终处于启用状态。
  • 除非在ComboBox#1中选择了特定值,否则将禁用ComboBox#2。
  • 仅在以下情况下启用该按钮:
    • 已从始终启用的组合框中选择了有效值。
    • 已从第二个组合框 IFF 中选择了有效值,并在第一个组合框中选择了特定值。否则,将忽略其值。
    • 在所有其他情况下,它被禁用。

问题在于键盘导航和控制焦点,以及它们如何与维护各种控件的Enabled状态相关的逻辑一起使用。

简而言之,在为组合框选择一个值时,按TAB键(选择组合框)会将焦点放在窗体上的下一个控件上(按TabIndex顺序),然​​后启用逻辑/禁用控件运行。

启用/禁用控件的逻辑发生在相关组合框的Validating / Validated事件中。

最终结果是控件可以在获得焦点后禁用。

例如:

  
      
  1. 仅启用ComboBox#1。 ComboBox#2和Button被禁用。所有ComboBox的SelectedItem都设置为null。
  2.   
  3. 将焦点设置为ComboBox#1。
  4.   
  5. 键入框的有效选项的前几个字母。
  6.   
  7. 按Tab键。
  8.   

当我按下TAB时,似乎在SelectedItem更改之前将焦点放在下一个控件上。在SelectedItem发生更改之前,无法运行启用或禁用其他UI控件的业务逻辑。

理想情况下,我想要的是反过来:焦点应该在UI控件的SelectedItem更新后移动,因此更新控件状态的逻辑已经运行。

有没有人对我如何做到这一点有任何建议?

1 个答案:

答案 0 :(得分:0)

您是否可以在SelectedIndexChanged / SelectedValueChanged中明确更改焦点以获取相应的组合框?您可能想要检查焦点当前的位置,并且只有在禁用的控件上才会移动。