2013-12-10 70 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); 
}