2009-06-01 26 views
7

TabControl içinde farklı tabItemslerim var ve her tabItem bazı giriş alanlarına sahiptir.tab öğesini seçinTüm programlı olarak WPF

Ben gerçek "İleri" butonuna

tabItem2.isSelected = içine bu kodu kullanıyorum

(sonraki ilk hareket için bir sihirbaz gibi) programlı tabItems arasında hareket ediyorum;

Sorunum, bunları tıklatarak tabiler arasında hareket ettiğimde, odak (klavye odağı) ilk metin kutusu girdisine gider.

Ancak, önceki kodla programlı olarak, odak, tabItem içindeki ilk giriş metin kutusuna gider.

Herhangi bir fikrin var mı?

+0

, yerine TabControl daha çerçeve denetimi ve Sayfaları kullanarak kabul var? Sihirbaz stili kullanıcı arayüzleri için çok daha uygun. –

+0

verdiğim cevap yanlıştı! :( –

cevap

3

IsSelected özelliğini zorlarsanız, ilk TextBox'a bir ad veririm ve seçili sekmeyi ayarladıktan sonra odağı ayarlayın.

Arabiriminizi dinamik olarak oluşturuyorsanız, bu işe yaramaz, ancak ilk önce mantıksal ağacı (veya sunum yapan/görüntüleme modellerini kullanıyorsanız görsel ağacı) arayan bir yardımcı program yöntemi oluşturabilirsiniz. giriş kontrolü ve ardından odağı ayarlayın.

+0

Veya textbox.Focus() öğesini çağırmak yerine, WPF'nin dahili olarak kendi TabItem.OnPreviewGotKeyboardFocus yönteminde ne yaptığını yapabilirsiniz, yani tabitem.MoveFocus() öğesini çağırın. – HappyNomad

0

Bu çözümler benim için çalışmadı. İstediğim TabItem'i seçti, ancak istenen TreeViewItem'i seçemedi/odaklayamadı. (TabItem önceden seçilmişse, sadece TVI'ye odaklanacaktır.) Aşağıdaki çözüm sonunda benim için çalışmıştır.

(FYI: Aşağıdaki parçacıklar, Microsoft Yardım Görüntüleyicisi 2.0'a benzer bir uygulamanın parçasıdır. "Senkronizasyon" düğmesini tıklattığınızda, önce seçili değilse önce İçerikler sekmesini seçer, daha sonra ağaç görünümünde tersine çevirir. eşleştirme ağaç görünümü öğesini bulur. o zaman/odaklanır seçer hangisi.)

Alkış

Meraktan soruyorum
private void OnClick_SyncContents(object sender, RoutedEventArgs e) 
{ 
    // If the help-contents control isn't visible (ie., some other tab is currently selected), 
    // then use our common extension method to make it visible within the tab control. Once 
    // it visible, the extension method will call the event handler passed (which is this method) 
    if (!this.m_UcHelpFileContents.IsVisible) 
    { 
     this.m_UcHelpFileContents. 
     SelectParentTabItem_WaitForMeToBecomeVisible_ThenCallThisEventHandlerWithNullArguments 
     (this.OnClick_SyncContents); 
    } 
    else 
    { 
     // Else the help-contents control is currently visible, thus focus the 
     // matching tree view item 
     /* Your code here that focuses the desired tree view item */ 
    } 
} 


public static class CommonExtensionMethods 
{ 
    public static void 
    SelectParentTabItem_WaitForMeToBecomeVisible_ThenCallThisEventHandlerWithNullArguments 
    (this FrameworkElement frameworkElement, RoutedEventHandler eventHandlerToCallWhenVisible) 
    { 
    // First, define the handler code for when the given framework element becomes visible 
    DependencyPropertyChangedEventHandler HANDLER = null; 
    HANDLER = (s, e) => 
    { 
     // If here, the given framework element is now visible and its tab item currently selected 
     // Critical: first and foremost, undo the latch to is-visible changed 
     frameworkElement.IsVisibleChanged -= HANDLER; 

     // Now invoke the event handler that the caller wanted to invoke once visible 
     frameworkElement.Dispatcher.BeginInvoke(eventHandlerToCallWhenVisible, null, null); 
    }; 

    // Use our common extension method to find the framework element's parent tab item 
    TabItem parentTabItem = frameworkElement.GetFirstParentOfType<TabItem>(); 

    if (parentTabItem != null) 
    { 
     // Assign the handler to the given framework element's is-visible-changed event 
     frameworkElement.IsVisibleChanged += HANDLER; 

     // Now set the tab item's is-selected property to true (which invokes the above 
     // handler once visible) 
     parentTabItem.IsSelected = true; 
    } 
    } 


    public static T GetFirstParentOfType<T> 
    (this FrameworkElement frameworkElement) where T : FrameworkElement 
    { 
    for (FrameworkElement fe = frameworkElement.Parent as FrameworkElement; 
     fe != null; 
     fe = fe.Parent as FrameworkElement) 
    { 
     if (fe is T) 
     return fe as T; 
    } 

    // If here, no match 
    return null; 
    } 
}