如何防止Tab键到UserControl?

时间:2011-10-12 19:21:23

标签: wpf xaml focus keyboard-navigation

我有一个自定义的Popup覆盖了我的部分屏幕。当它打开时,我想禁用Tabbing到它后面的UserControl。我不想使用IsEnabled属性,因为我不想使所有控件变灰。

还有另一个属性做同样的事吗? IsTabStop仅阻止选项卡在UserControl本身上停止,而不是它的子项,并且IsFocusable不是UserControl的有效属性。

6 个答案:

答案 0 :(得分:17)

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

KeyboardNavigation.TabNavigation="None"

答案 1 :(得分:5)

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

这样,你只需要设置一次。

答案 2 :(得分:0)

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

如果您需要任何帮助,请与我联系。

答案 3 :(得分:0)

将该属性绑定到用户控件。

    <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>

答案 4 :(得分:0)

在我的情况下,使用KeyboardNavigation.TabNavigation="None"的解决方案似乎会涉及所有其他父容器。在某些情况下可能不希望这样做。 所以我想出了一个在代码后面的PreviewKeyDown-Event,像这样:

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

答案 5 :(得分:0)

这对我有用:

// ...

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

    KeyboardNavigation.SetTabNavigation(
        element: applicationWindow, 
        mode: false);
}

// ...

注意:最好有一个备份计划来恢复键盘导航,以防万一只是临时需要上面的情况。