WPF

2009-06-01 14 views
7

में प्रोग्रामेटिक रूप से टैबइटम का चयन करें मेरे पास टैबकंट्रोल में अलग-अलग टैब हैं और प्रत्येक टैब में कुछ इनपुट फ़ील्ड हैं।WPF

मैं (पहली से दूसरी में स्थानांतरित करने के लिए एक जादूगर की तरह)

मैं "अगला" बटन

tabItem2.isSelected = सच के अंदर इस कोड का उपयोग कर रहा प्रोग्राम के रूप में TabItems के बीच चलती हूँ;

मेरी समस्या यह है कि जब मैं टैब इटम्स के बीच उनके द्वारा क्लिक करके स्थानांतरित करता हूं, तो फोकस (कीबोर्ड फोकस) पहले टेक्स्टबॉक्स इनपुट में स्थानांतरित हो जाएगा।

लेकिन पिछले कोड के साथ प्रोग्रामेटिक रूप से, फ़ोकस टैबइटम के अंदर पहले इनपुट टेक्स्टबॉक्स आइटम पर नहीं चलेगा।

कोई विचार?

+0

, आप, फ्रेम नियंत्रण और पेज का इस्तेमाल करके उनकी एक TabControl से विचार किया है? यह विज़ार्ड-शैली यूआई के लिए काफी बेहतर है। –

+0

मैंने जो जवाब दिया वह गलत था! :( –

उत्तर

3

यदि आप IsSelected संपत्ति को मजबूर कर रहे हैं, तो मैं पहले टेक्स्टबॉक्स को एक नाम भी दूंगा और चयनित टैब सेट करने के बाद फोकस सेट करूंगा।

यदि आप गतिशील रूप से अपना यूआई बना रहे हैं, तो यह काम नहीं करेगा, लेकिन आप एक उपयोगिता विधि बना सकते हैं जो तार्किक पेड़ (या दृश्य वृक्ष यदि आप प्रस्तुतियों/दृश्य-मॉडल का उपयोग कर रहे हैं) की खोज करता है इनपुट नियंत्रण और फिर फोकस सेट करें।

+0

या टेक्स्टबॉक्स को कॉल करने के बजाय। फोकस(), आप ऐसा कर सकते हैं जो WPF आंतरिक रूप से अपने TabItem.OnPreviewGotKeyboardFocus विधि में करता है। यही है, tabitem.MoveFocus() पर कॉल करें। – HappyNomad

0

ये समाधान मेरे लिए काम नहीं करते थे। यह अब तक चाहता था TabItem का चयन करने के लिए मिला, लेकिन यह वांछित TreeViewItem का चयन/ध्यान केंद्रित करने में सक्षम नहीं था। (अगर टैबिटेम पहले से ही चुना गया था तो यह केवल टीवीआई पर ध्यान केंद्रित करेगा।) अंत में नीचे दिए गए समाधान ने मेरे लिए काम किया।

(FYI:। नीचे के टुकड़े एप्लिकेशन की बात यह है कि माइक्रोसॉफ्ट मदद व्यूअर 2.0 के समान है कर रहे हैं आप "समन्वयन" बटन क्लिक करते हैं, यह पहली सामग्री टैब यदि पहले से चयनित नहीं, का चयन करता है तो यह जब तक ट्री व्यू में पार करता मिलान ट्री व्यू आइटम पाता है। कौन सा यह तो का चयन करता है/केंद्रित है।)

चीयर्स

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; 
    } 
} 
बस ब्याज से बाहर
संबंधित मुद्दे

 संबंधित मुद्दे