【问题标题】:How can I prevent tabbing to a UserControl?如何防止 Tab 切换到 UserControl?
【发布时间】:2011-10-12 19:21:22
【问题描述】:

我有一个覆盖部分屏幕的自定义弹出窗口。当它打开时,我想禁用它后面的 UserControl 选项卡。我不想使用IsEnabled 属性,因为我不想让所有控件变灰。

还有其他属性可以做同样的事情吗? IsTabStop 仅阻止选项卡在 UserControl 本身上停止,而不是在子级上,IsFocusable 不是 UserControl 的有效属性。

【问题讨论】:

  • FocusableUserControl 上的一个属性,继承自 UIElement。设置Focusable="False"IsHitTestVisible="False" 应该可以解决您的问题
  • @Meleak 那行不通。我仍然可以选择我的 UserControl 中的控件
  • 用户控件上的KeyboardNavigation.TabNavigation="None" 有帮助吗?看看here
  • @LPL 我收回了它,这确实有效:) 我在我的 UserControl 中设置了我的KeyBoardNavigation.TabNavigation,所以触发器没有效果。如果您将其发布为答案,我会接受。
  • 感谢您的提议。我接受:)

标签: wpf xaml focus keyboard-navigation


【解决方案1】:

在您的容器控件上使用 KeyboardNavigation.TabNavigation Attached PropertyKeyboardNavigationMode.None

KeyboardNavigation.TabNavigation="None"

【讨论】:

    【解决方案2】:

    您可以将子控件上的IsTabStop 绑定到UserControl 上的IsTabStop

    这样,您只需设置一次。

    【讨论】:

    • 我的 UserControl 中目前有 35 个控件...我真的不想为所有控件创建绑定,并且必须记住为新控件设置该绑定。没有更简单的方法可以在 UserControl 级别禁用它吗?
    • 一个循环? foreach (grid.Children 中的控制控件) { control.IsTabStop = false; }
    • 它必须是一个遍历所有级别子对象的循环......我想这是可能的
    【解决方案3】:

    您可以编写一个附加属性,将其设置在顶部元素中。
    该附加属性会在所有子元素中递归地将 IsTabStop 设置为 false。

    如果您需要任何帮助以使其正常工作,请告诉我。

    【讨论】:

      【解决方案4】:

      只需将该属性绑定到用户控件即可。

          <UserControl x:Class="PDV.UserControls.InputField"
                       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                       // etc... then:                     
                       x:Name="Root" KeyboardNavigation.TabNavigation="Local" >
      
              <Grid>
                 <TextBox Name="textBox"  
                      TabIndex="{Binding Path=TabIndex, ElementName=Root}" 
                      IsTabStop="{Binding Path=IsTabStop, ElementName=Root}"  />                
              </Grid>
          </UserControl>
      

      【讨论】:

        【解决方案5】:

        在我的情况下,KeyboardNavigation.TabNavigation="None" 的解决方案似乎适用于所有其他父容器。在某些情况下,这可能是不想要的。 所以我在后面的代码中想出了一个 PreviewKeyDown-Event:

            private void OnPreviewKeyDown(object sender, KeyEventArgs e)
            {
                if (e.Key == Key.Tab)
                {
                    ((Control)sender).Focus(); 
                    e.Handled = true;
                }
            }
        

        【讨论】:

          【解决方案6】:

          这对我有用:

          // ...
          
          var applicationWindow = Application.Current?.MainWindow;
          if (applicationWindow != null)
          {
              KeyboardNavigation.SetIsTabStop(
                  element: applicationWindow, 
                  isTabStop: false);
          
              KeyboardNavigation.SetTabNavigation(
                  element: applicationWindow, 
                  mode: false);
          }
          
          // ...
          

          注意:如果以上只是暂时需要,最好有一个恢复键盘导航的备份计划。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多