WPF标签索引问题

WPF标签索引问题,wpf,tabindex,Wpf,Tabindex,我正在开发一个应用程序,其中用户定义表单上的控件,并可以设置任何控件的选项卡索引。当每个控件添加到包含可视表单区域的网格中时,选项卡索引设置为0(默认)或某个用户定义的选项卡索引。在运行时更改其中一个控件的tabindex(索引似乎无关紧要)之前,在表单中进行Tabbing可以正常工作。在此之后,Tabbing只在一些控件中循环,此外,窗口菜单项现在是tab stops(它们不是在tabindex更改之前),菜单的选项卡属性未绑定到任何datacontext 当前更改的控件是一个复选框,但我无法

我正在开发一个应用程序,其中用户定义表单上的控件,并可以设置任何控件的选项卡索引。当每个控件添加到包含可视表单区域的网格中时,选项卡索引设置为0(默认)或某个用户定义的选项卡索引。在运行时更改其中一个控件的tabindex(索引似乎无关紧要)之前,在表单中进行Tabbing可以正常工作。在此之后,Tabbing只在一些控件中循环,此外,窗口菜单项现在是tab stops(它们不是在tabindex更改之前),菜单的选项卡属性未绑定到任何datacontext

当前更改的控件是一个复选框,但我无法用简化的布局重现该行为,因此任何建议都会有所帮助。

当将新控件推到顶部时,我们的“表单页面”用户控件不可见且在当前可见页面下从未被禁用。因此,它们被包含在选项卡索引行为中,导致不必要的副作用

这帮助我弄清了问题的真相:

void InitializeFocusLogger() {
        //debug key logging to make focus bugs easier to track
        EventManager.RegisterClassHandler(
            typeof(UIElement),
            Keyboard.PreviewGotKeyboardFocusEvent,
            (KeyboardFocusChangedEventHandler)OnPreviewGotKeyboardFocus);
}

string lastID = string.Empty;
private void OnPreviewGotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)         {
    FrameworkElement control = e.NewFocus as FrameworkElement;
    if (control == null) return;

    ControlViewModel controlVM = control.DataContext as ControlViewModel;

    if (controlVM == null || lastID == controlVM.ID) return;

    lastID = controlVM.ID;

    Debug.Print("Focused: {0} TabIndex: {1}", controlVM.ID, controlVM.TabIndex);
}

顺便说一句,网格中没有选项卡控件,只有按钮、复选框、标签等。如果不发布代码,你不能指望有人帮助你解决问题。据我所知,你必须将用户创建表单的选项卡索引保存在文件中,并将这些选项卡索引分配给用户创建表单的所有控件。是的,某些选项卡索引是在编译或默认情况下分配的。在运行时,可以重新分配任何选项卡索引。重新分配会导致表循环中断并停留在一个控件上-通常是一个具有默认或0索引的控件,并且通常使用shift tab(向后)进行制表。