【问题标题】:UI Issue - Controlling Control state and focusUI 问题 - 控制控件状态和焦点
【发布时间】:2009-12-21 05:04:05
【问题描述】:

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

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

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

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

简而言之,在为组合框选择值时,按 TAB(以选择组合框)将焦点放在表单上的下一个控件(根据 TabIndex 顺序)在启用逻辑之前/禁用控件正在运行。

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

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

例如:

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

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

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

有人对我如何做这件事有任何建议吗?

【问题讨论】:

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


    【解决方案1】:

    您能否明确更改 SelectedIndexChanged / SelectedValueChanged 中相应组合框的焦点?您可能想检查当前焦点在哪里,并且仅在它位于禁用控件上时才移动。

    【讨论】:

    • 听起来这几乎就是我需要的解决方案。只有一件事困扰着我,那就是当我强行聚焦控件时尊重控件的 TabIndex。看来我必须在这里做的是告诉 .NET 我知道得更好,并且需要集中控制这个控件。现在的问题是,如果使用键盘导航,你如何区分按下 TAB 和 SHIFT+TAB 的人?如果他们在禁用控件的方向导航 UI,我只想移动焦点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    相关资源
    最近更新 更多