2010-01-29 16 views
5

मैंने PreviewLostKeyboardFocus के साथ गड़बड़ी की है जो लगभग आपको वहां ले जाती है। मैंने LostFocus का उपयोग करके कुछ कार्यान्वयन देखा है, लेकिन यह ध्यान केंद्रित करने के बाद TextBox पर वापस ध्यान केंद्रित करता है और आप आसानी से स्क्रीन पर इस स्थानांतरण को देख सकते हैं। असल में, मैं केवल उसी प्रकार के व्यवहार की तलाश कर रहा हूं जिसे आप WinForms में OnValidating का उपयोग कर प्राप्त कर सकते हैं।सत्यापन त्रुटि होने पर टेक्स्टबॉक्स फोकस को रोकने से रोकने का सबसे अच्छा तरीका क्या है?

+1

फोकस पकड़ने बनाने नियंत्रण में खराब उपयोगकर्ता अनुभव हो सकता है ... बस उपयोगकर्ताओं को उस संवाद/विंडो चीज़ से आसानी से बाहर निकलने दें ... –

उत्तर

5

मेरी राय में, सबसे अच्छा तरीका आम तौर पर ऐसा नहीं करना है। अन्य नियंत्रणों को अक्षम करने या मूल्य वैध होने तक बचत को रोकने के लिए लगभग हमेशा बेहतर होता है।

लेकिन अगर अपने डिजाइन वास्तव में इस क्षमता की जरूरत है, यहाँ आप क्या करना चाहिए है:

  1. अवरोधन अपनी खिड़की स्तर पर कीबोर्ड और माउस की घटनाओं के Preview संस्करण, या जो कुछ भी गुंजाइश आप ध्यान परिवर्तनों को रोकने के लिए चाहते हैं भीतर (उदाहरण के लिए शायद आपका मेनू बार नहीं)।

  2. जब टेक्स्ट कुंजी में टैब कीडाउन या रिटर्न कीडाउन का पता लगाया जाता है, या जब टेक्स्ट बॉक्स के बाहर माउसडाउन का पता लगाया जाता है, तो बाध्यकारी अभिव्यक्ति पर अपडेटसोर्स() को कॉल करें, फिर सत्यापन विफल हो गया है KeyDown या MouseDown ईवेंट को संसाधित होने से रोकने के लिए हैंडल = सत्य सेट करें।

  3. कीबोर्ड या माउस से नहीं हैं, या आपके अन्य कोड को पहचानने वाले फोकस परिवर्तन के किसी भी कारण को पकड़ने के लिए PreviewLostKeyboardFocus को संभालना जारी रखें।

+0

वैश्विक (विंडो स्तर) माउस ईवेंट कैसे पकड़ें? यदि हमारे पास कंटेनर नियंत्रण है और फोकस संपादक के अंदर रहना चाहिए जब तक वैध डेटा पास नहीं किया जाएगा। –

2

रे की जवाब पर जोड़ने के लिए:

UpdateSource तो जैसे कहा जाता है:

BindingExpression be = userTextbox.GetBindingExpression(TextBox.TextProperty); 
be.UpdateSource(); 

इसके अलावा, एक विकल्प के रूप में आप के लिए बाध्य पाठ बॉक्स सेट कर सकते हैं:

UpdateSourceTrigger = "PropertyChanged"; 

उत्तरार्द्ध एक निरंतर जांच का कारण बनता है, जबकि पूर्व आवश्यक (प्रदर्शनकर्ता) की जांच करेगा।

1

आप अपने स्वयं के LostFocus हैंडलर के अंदर एक तत्व आप एक StackOverflowException का सामना करना पड़ेगा ध्यान केंद्रित करने का प्रयास करते हैं, मैं मूल कारण (मैं चारों ओर बाउंस का ध्यान केंद्रित तरह संदेह है) के बारे में यकीन नहीं है लेकिन वहाँ एक आसान समाधान नहीं है: यह प्रेषण ।

private void TextBox_LostFocus(object sender, RoutedEventArgs e) 
{ 
    var element = (sender as TextBox); 
    if (!theTextBoxWasValidated()) 
    { 
     // doing this would cause a StackOverflowException 
     // element.Focus(); 
     var restoreFocus = (System.Threading.ThreadStart)delegate { element.Focus(); }; 
     Dispatcher.BeginInvoke(restoreFocus); 
    } 
} 
Dispatcher.BeginInvoke के माध्यम से

आप यह सुनिश्चित करें कि फोकस बहाल ध्यान की प्रगति नुकसान के रास्ते में नहीं मिलता है (और बुरा अपवाद आप अन्यथा का सामना करना चाहते हैं बचने के लिए)

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

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