समस्या का वर्णनWPF अनुप्रयोग पूरी तरह से खिड़की पर ध्यान केंद्रित खो देता करीब
अगर मैं एक माता पिता के खिड़की के लिए विंडो के मालिक की स्थापना के माध्यम से एक बच्चे को विंडो के रूप में एक गैर-मोडल विंडो करें, और उसके भीतर से एक संदेशबॉक्स दिखाने अगर मैं बाल खिड़की बंद करता हूं तो यह बच्चा खिड़की, पैरेंट विंडो फोकस खो जाएगी। यदि विंडोज एक्सप्लोरर या कोई अन्य ऐप खुला है, तो इस ऐप को फोकस मिलेगा और मेरी मुख्य विंडो छिपी जाएगी।
यह एक ज्ञात समस्या प्रतीत होता है क्योंकि मैंने इसे newsgroups में देखा, लेकिन मैंने एक अच्छा समाधान नहीं देखा है। ऑनडिक्टिवेट में मालिक को शून्य पर सेट करना एक विकल्प नहीं है। संदेश बॉक्स को शून्य और रीसेट करने से पहले मालिक को सेट करने से पहले मदद नहीं मिलती है। ऑनक्लोज्ड इवेंट में मालिक को शून्य पर सेट करने से भी मदद नहीं मिलती है।
सरल समाधान
पाया आप एक ही समस्या का अनुभव के रूप में मैं का वर्णन किया है, तो सभी बच्चे खिड़कियों के OnClosing में निम्न कोड डालें।
void OnClosing(System.ComponentModel.CancelEventArgs e)
base.OnClosing(e);
if (null != Owner) {
Owner.Activate();
}
// ....
इसके बाद किसी और प्रसंस्करण तर्क के बाद, संदेशबॉक्स खोलने को भी सहन किया जा सकता है।
उदाहरण-संहिता
मुद्दा बहुत बड़ा के रूप में मैंने सोचा था कि हो रहा है। यदि संदेश बॉक्स खोला जाएगा और बच्चे की विंडो बंद हो जाएगी (कोड को एक लोड किए गए ईवेंट-विंडो के हैंडलर में कॉपी करें) तो निम्न उदाहरण पैरेंट विंडो का फोकस हटा देगा।
Window firstChildWindow = new Window() {
Title = "Floating Window", Width = 100, Height = 70
};
firstChildWindow.Owner = Window.GetWindow(this);
Button button = new Button() { Content="MessageBox"};
button.Click += delegate {
MessageBox.Show("Klicking her breaks the focus-chain."); };
firstChildWindow.Content = button;
firstChildWindow.Show();
इसके अलावा इस उदाहरण टूट जाता है ध्यान केंद्रित श्रृंखला:
Window firstChildWindow = new Window() {
Title = "Floating Window", Width = 100, Height = 70
};
firstChildWindow.Owner = Window.GetWindow(this);
firstChildWindow.Show();
Window secondChildWindow = new Window() {
Title="Second Window",Width=100,Height=70};
secondChildWindow.Content = new TextBlock() {
Text="SecondWindow"};
secondChildWindow.Owner = firstChildWindow;
secondChildWindow.Show();
कोई इस समस्या के लिए एक प्रस्ताव है। मैं डिस्पैचर या डिस्पैटर टाइमर के साथ बंद होने के बाद माता-पिता को ध्यान देने के लिए एक हैक के बारे में सोचता हूं या शायद यह बंद करने पर माता-पिता को मैन्युअल बल फोकस करने के लिए काम करेगा लेकिन यह सब मुझे बहुत अशुद्ध लगता है (और यह भी थोड़ा जटिल है मेरे माता-पिता की अधिक सक्रिय स्वामित्व वाली खिड़कियां हैं, जैसा कि मेरे वर्तमान ऐप में है)।
कोई भी इस के लिए एक साफ समाधान जानता है?
संसाधन
MSDN Description (बुला खोला गैर मोडल खिड़कियों के लिए टिप्पणी के नीचे देख दिखाएँ())
Same problem on msdn forums without appropriate solution
कृपया यह भी देखें: Instable focus of WPF apps
मैंने आपके प्रश्न को पूरी तरह गलत समझा, क्षमा करें, मैंने अपना जवाब हटा दिया है। – Nir
कोई समस्या नहीं, वैसे भी उत्तर के लिए धन्यवाद - मैंने अपनी समस्या को थोड़ा और स्पष्ट करने के लिए विवरण बदल दिया :) – HCL