.net 切换到Tab上的下一个Tab键在Tab项的最后一个控件上按下

.net 切换到Tab上的下一个Tab键在Tab项的最后一个控件上按下,.net,wpf,vb.net,tabs,.net,Wpf,Vb.net,Tabs,我正在使用WPF制作一个桌面应用程序,其中有一个带有几个按钮的窗口和一个带有动态创建的多个选项卡项的选项卡控件。每个选项卡项中都有许多控件 我想在按下当前选项卡项上的最后一个控件后移动到下一个选项卡项。现在,它只是在整个窗口和同一选项卡项上的所有控件之间循环。我已经设置了选项卡索引,并尝试设置KeyboardNavigation.TabNavigation=“Once”以及Local、Cycle、Continue等。。但这没用 如下图所示,当我在“逮捕日期”上按tab键时,我想移动到“Texas

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

我想在按下当前选项卡项上的最后一个控件后移动到下一个选项卡项。现在,它只是在整个窗口和同一选项卡项上的所有控件之间循环。我已经设置了选项卡索引,并尝试设置KeyboardNavigation.TabNavigation=“Once”以及Local、Cycle、Continue等。。但这没用

如下图所示,当我在“逮捕日期”上按tab键时,我想移动到“Texas”选项卡上的第一个控件,但它将返回到同一选项卡上的“Name”控件


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

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

选项卡必须设置
Name
属性(
XAML
中的
x:Name
)。选项卡上的“最后一个”项还必须设置
名称
属性

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

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

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

Debug.WriteLine("key pressed: " + e.Key);
if (e.Key == Key.Tab)
{
    if (btnButton.IsFocused) tab2.Focus();
}
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;
        }
    }
}
private void tabControl\u KeyDown(对象发送方,KeyEventArgs e)
{
Debug.WriteLine(“按键:+e.key”);
if(e.Key==Key.Tab)
{
var tabs=tabControl.Items.Cast().ToArray();
var tab=tabs.Select((t,i)=>new{i,t})。SingleOrDefault(t=>t.t.IsSelected);//必须选择一个。结果为空,即不存在任何制表符(那么为什么有制表符控件?)
如果(tab==null)返回;
开关(表一)
{
案例0:
if(btnButton.IsFocused)
tab2.Focus();
打破
案例1:
tab3.Focus();
打破
案例2:
表4.焦点();
打破
案例3:
tab1.Focus();//跳转到第一个?
//或者做点别的
打破
违约:
打破
}
}
}

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

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

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

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

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

Debug.WriteLine("key pressed: " + e.Key);
if (e.Key == Key.Tab)
{
    if (btnButton.IsFocused) tab2.Focus();
}
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;
        }
    }
}
private void tabControl\u KeyDown(对象发送方,KeyEventArgs e)
{
Debug.WriteLine(“按键:+e.key”);
if(e.Key==Key.Tab)
{
var tabs=tabControl.Items.Cast().ToArray();
var tab=tabs.Select((t,i)=>new{i,t})。SingleOrDefault(t=>t.t.IsSelected);//必须选择一个。结果为空,即不存在任何制表符(那么为什么有制表符控件?)
如果(tab==null)返回;
开关(表一)
{
案例0:
if(btnButton.IsFocused)
tab2.Focus();
打破
案例1:
tab3.Focus();
打破
案例2:
表4.焦点();
打破
案例3:
tab1.Focus();//跳转到第一个?
//或者做点别的
打破
违约:
打破
}
}
}

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

我已经考虑过这种方法,这将起作用,但为此,我需要手动识别最后一个控件,并找出每个选项卡项中的下一个选项卡,这在一般情况下可能不难,但在我的情况下,所有选项卡都是动态生成的,并且根据客户定义的某些参数而有所不同。因此,并非所有客户的标签顺序都相同。此外,在某些情况下甚至可能不添加选项卡,例如,如果客户不想要或没有指纹系统,则不会生成“指纹”选项卡。(续..)类似地,每个选项卡中的控件也可能基于各种参数和应用程序模式存在或不存在。这使得很难找到选项卡项上的最后一个控件。最重要的是,如果我认为手动定义这一切不是一个好方法。所以,我想知道wpf是否为此提供了内置功能?谢谢您可以为特定最后一个控件的
KeyDown
(或
keydup
)事件执行此操作,而不是在
选项卡control
本身上执行此操作。然后它实际上是一个单行程序,类似于
if(e.Key==Key.Tab)tabX.Focus()
where
tabX
是您要激活的选项卡。我现在使用您提供的概念进行操作,但如果有其他方法,请保留问题。谢谢我已经考虑过这种方法,这将起作用,但为此,我需要手动确定最后一个控件,并找出每个选项卡项中下一个选项卡,这在一般情况下可能并不困难,但在我的情况下,所有选项卡都是动态生成的,并且根据客户定义的一些参数而有所不同。因此,并非所有客户的标签顺序都相同。此外,选项卡可能不可用