2013-12-10 40 views
0

我正在处理一个应用程序,其中用户定义了窗体上的控件并可以设置任何控件的选项卡索引。由于每个控件都添加到包含可查看表单区域的网格中,因此将选项卡索引设置为0(默认)或某些用户定义的选项卡索引。通过表单的Tab键工作正常,直到其中一个控件的Tabindex在运行时发生更改(索引似乎无关紧要)。之后,Tab键仅循环一些控件,此外,窗口菜单项现在是制表符停止(它们不在tabindex更改之前)。此外,菜单的制表符属性未绑定到任何数据上下文。WPF选项卡索引问题

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

+0

顺便说一句 - 有没有TabControl的只是按钮,复选框,标签等,在一个网格。 – jchristof

+0

你不能指望别人来帮助你解决问题,而不会发布你的代码 – makc

+0

据我所知,你必须保持用户创建表单的标签索引在文件中,并将这些标签索引分配给用户创建表单的所有控件。 – YOusaFZai

回答

1

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

这帮助我得到这个问题的底部:

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); 
}