2012-12-19 12 views
15

में टेक्स्ट बॉक्स पर काम नहीं करता है। मैं अपने सिर को बैंग कर रहा हूं कि wpf में ठीक करने के लिए इतनी सरल समस्या की तरह दिखता है लेकिन मुझे अभी तक पता नहीं चला है कि मैं अपने ऐप को मेरे अनुसार व्यवहार क्यों नहीं कर सकता योजना।कीबोर्ड। फोकस WPF

मेरे पास एक छोटा सा खोज बॉक्स है जो मेरे wpf एप्लिकेशन में पॉप-अप करता है जब उपयोगकर्ता ctrl + f दबाता है। मैं चाहता हूं कि खोज बॉक्स टेक्स्ट बॉक्स के अंदर कैरेट के लिए फ्लैशिंग हो, जो उपयोगकर्ता को बिना किसी इनपुट इनपुट के लेने के लिए तैयार हो। यहां टेक्स्ट बॉक्स के लिए xaml कोड है जो दृश्यमान, सक्षम, परीक्षण योग्य, टैबस्टॉपबल और फोकस करने योग्य है।

<TextBox x:Name="SearchCriteriaTextBox" Text="{Binding SearchCriteria}" Focusable="True" IsEnabled="True" IsTabStop="True" IsHitTestVisible="True" Style="{DynamicResource SearchTextBoxStyle}" Grid.Column="1" Margin="5,10,0,5" /> 

पीछे कोड में, मेरे पास यह विधि है जब खोज बॉक्स की दृश्यता प्रभावित होती है। ऐप की शुरुआत में खोज बॉक्स लोड किया गया है।

/// <summary> 
    /// Handles events triggered from focusing on this view. 
    /// </summary> 
    /// <param name="sender">The sender.</param> 
    /// <param name="dependencyPropertyChangedEventArgs">The key event args.</param> 
    private void OnIsVisibleChanged(object sender, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs) 
    { 
     if (!((bool) dependencyPropertyChangedEventArgs.NewValue)) 
     { 
      return; 
     } 

     SearchCriteriaTextBox.Focus(); 
     Keyboard.Focus(SearchCriteriaTextBox); 
     SearchCriteriaTextBox.Select(0, 0); 

     if (SearchCriteriaTextBox.Text.Length > 0) 
     { 
      SearchCriteriaTextBox.SelectAll(); 
     } 
    } 

समस्या यह है कि कोड कहा जाता है, घटक isFocused = true बन जाता है लेकिन कीबोर्ड फोकस प्राप्त नहीं करता है। क्या मुझे कुछ याद आ रही है? जब तक कोई अन्य नियंत्रण कुंजीपटल फोकस पर क्रूरता से नहीं रहता है, जो मुझे यकीन है कि मैंने कोड नहीं किया है, तो यह सरल कोड का टुकड़ा ठीक से काम नहीं करेगा।

+2

लोड किए गए ईवेंट के बाद ऐसा करने का प्रयास करें। –

+1

मुझे लगता है कि इस विधि को बुलाए जाने के बाद एक और नियंत्रण फोकस करता है। शायद आपको किसी अन्य घटना में फोकस करना चाहिए। – Ramin

+0

@ हाईकोर मेरे पास एक प्रश्न है: क्या दृश्यता में हर बार लोड होने वाली घटना आग लगती है? – Ramin

उत्तर

50

समाधान के लिए, यदि आप किसी बाद DispatcherPriority पर फ़ोकस सेट करने Dispatcher उपयोग करते हुए, इस तरह के Input

Dispatcher.BeginInvoke(DispatcherPriority.Input, 
    new Action(delegate() { 
     SearchCriteriaTextBox.Focus();   // Set Logical Focus 
     Keyboard.Focus(SearchCriteriaTextBox); // Set Keyboard Focus 
    })); 

अपनी समस्या का वर्णन से के रूप में की कोशिश कर सकते, ऐसा लगता है कीबोर्ड फोकस की जरूरत नहीं है लगता है सेट। डब्ल्यूपीएफ में कई फोकस स्कोप्स हो सकते हैं, इसलिए कई तत्वों में लॉजिकल फोकस (IsFocused = true) हो सकता है, हालांकि केवल एक तत्व में कीबोर्ड फोकस हो सकता है और कीबोर्ड इनपुट प्राप्त होगा।

आपके द्वारा पोस्ट किया गया कोड सही ध्यान केंद्रित करना चाहिए, इसलिए आपके TextBox से कीबोर्ड फोकस को स्थानांतरित करने के लिए कुछ बाद में होना चाहिए। बाद में प्रेषक प्राथमिकता पर फ़ोकस सेट करके, आप यह सुनिश्चित कर लेंगे कि आपके SearchCriteriaTextBox पर कीबोर्ड फ़ोकस सेट करना आखिरी हो जाता है।

+1

बस पता चला कि, मेरी अपनी प्रतिक्रिया पोस्ट करने वाला था, धन्यवाद राहेल यह एक बहु थ्रेडेड वातावरण में पूरी तरह से काम करता है। संपादित करें: आप Dispatcher को कॉल कर सकते हैं। BginginInvoke (DispatcherPriority.Input, नया थ्रेडस्टार्ट (() => SearchCriteriaTextBox.Focus()); उसी परिणाम के लिए, टेक्स्टबॉक्स फोकस को कॉल किए बिना – legrandviking

+0

यह मेरे लिए काम करता है: MessageBox.Show ("foo"); myTextBox.Select (0, myTextBox.Text.Length); myTextBox।फोकस(); – Krafty

+0

क्या किसी के पास इस समस्या का स्पष्टीकरण है? –

0

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

किसी भी तरह से मैंने इसे कॉल करके तय किया। ग्रिड के माउसइंटर घटना पर फोकस()। मेरे लिए ठीक काम करता है।

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