【问题标题】:Switch to next Tab on Tab key press when on last control of a TabItem在 TabItem 的最后一个控件上切换到 Tab 键上的下一个 Tab
【发布时间】:2016-10-11 16:23:20
【问题描述】:

我正在使用 WPF 制作一个桌面应用程序,其中我有一个带有几个按钮的窗口和一个带有动态创建的多个选项卡项的选项卡控件。每个选项卡项中都有很多控件。

我想在按当前选项卡项上的最后一个控件后移到下一个选项卡项。现在它只是循环遍历整个窗口和相同选项卡项上的所有控件。我已经设置了标签索引,并尝试设置 KeyboardNavigation.TabNavigation="Once" 以及 Local、Cycle、Continue 等。但没有帮助。

如下图所示,当我在“逮捕日期”上按选项卡时,我想移动到“德克萨斯”选项卡上的第一个控件,但它只会回到同一选项卡上的“名称”控件。

【问题讨论】:

    标签: .net wpf vb.net tabs


    【解决方案1】:

    按下Control+Tab 时会显示下一个选项卡,并且该选项卡中的第一个控件将获得焦点。要向后导航,请使用Control+Shift+Tab

    【讨论】:

      【解决方案2】:

      您的选项卡必须具有 Name 属性集(XAML 中的x:Name)。选项卡上的“最后一个”项也必须设置Name 属性。

      现在设置TabControl 对象的KeyDown(或KeyUp)事件:

      Debug.WriteLine("key pressed: " + e.Key);
      if (e.Key == Key.Tab)
      {
          if (btnButton.IsFocused) tab2.Focus();
      }
      

      Debug.WriteLine(...) 仅用于确保密钥被捕获、注释或在一切正常后删除该行。

      按顺序关注选项卡需要几行额外的代码。这是完整的KeyDown 事件:

      private void tabControl_KeyDown(object sender, KeyEventArgs e)
      {
          Debug.WriteLine("key pressed: " + e.Key);
          if (e.Key == Key.Tab)
          {
              var tabs = tabControl.Items.Cast<TabItem>().ToArray();
      
              var tab=tabs.Select((t, i)=>new {i, t}).SingleOrDefault(t => t.t.IsSelected); // one has to be selected. result is null of no tabs are present (then why have a tab control?)
      
              if (tab == null) return;
              switch (tab.i)
              {
                  case 0:
                      if (btnButton.IsFocused)
                          tab2.Focus();
                      break;
                  case 1:
                      tab3.Focus();
                      break;
                  case 2:
                      tab4.Focus();
                      break;
                  case 3:
                      tab1.Focus(); // jump to first?
                      // OR do something else
                      break;
                  default:
                      break;
              }
          }
      }
      

      btnButton 替换为表单上的“最后一个”项目。

      【讨论】:

      • 我已经考虑过这种方法,这将起作用,但为此我需要手动识别最后一个控件,并找出每个选项卡项中的下一个选项卡,这在一般情况,但在我的情况下,所有选项卡都是动态生成的,并且根据客户定义的某些参数而有所不同。因此,并非所有客户的标签顺序都相同。此外,在某些情况下甚至可能不会添加选项卡,例如,如果客户不想要或没有指纹系统,则不会生成“指纹”选项卡。 (续……)
      • 同样,每个选项卡中的控件也可能存在或不存在,具体取决于各种参数和应用模式。这使得很难找到选项卡项上的最后一个控件。最重要的是,如果我手动定义这一切不是一个好方法。所以,我想知道 wpf 是否为此提供了内置的东西?谢谢!
      • 您可以为特定最后一个控件的KeyDown(或KeyUp)事件执行此操作,而不是在TabControl 本身上执行此操作。然后它实际上是一个单行,类似于if (e.Key==Key.Tab) tabX.Focus();,其中tabX 是您要激活的选项卡。
      • 我现在正在使用您提供的概念进行此操作,但如果有其他方法,请留下问题。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-13
      • 1970-01-01
      • 2011-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多