मैंने एक WPF एप्लिकेशन में यह बहुत ही अजीब व्यवहार देखा है।एक अन्य विंडो के बाद मुख्य विंडो अन्य एप्लिकेशन की खिड़कियों के पीछे गायब हो जाती है, एक तीसरी विंडो पर ShowDialog का उपयोग करता है
मेरे पास MainWindow
है, जो App.OnStartup
से Show()
का उपयोग करके दिखाया गया है। MainWindow
एक (गैर मोडल) SubWindow
खोल सकते हैं, भी Show()
का उपयोग कर कहा। SubWindow
का Owner
MainWindow
पर सेट है।
जब SubWindow
बंद कर दिया है, MainWindow
दिखाई फिर से (अच्छा) है।
कुछ कार्यों (Owner
SubWindow
पर सेट है) SubWindow
मॉडल संवाद के रूप में एक तिहाई विंडो खोलने के लिए, ShowDialog()
का उपयोग कर पैदा कर सकता है। जब उस मोडल संवाद को SubWindow
के जीवनकाल के दौरान कम से कम एक बार खोला और बंद कर दिया जाता है, तो अजीब बात होती है।
SubWindow
बंद करने के बाद, MainWindow
दृश्य में नहीं आती है। इसके बजाए, जो भी यादृच्छिक विंडो MainWindow
के पीछे है। क्या कोई मुझे बता सकता है कि ऐसा क्यों होता है, और इसे कैसे ठीक किया जाए?
इससे कोई फर्क नहीं पड़ता कि मोडल डायलॉग ShowDialog()
का उपयोग करके प्रदर्शित किया गया है, या MessageBox.Show()
का उपयोग करके दिखाया गया एक संदेश बॉक्स है।
यहाँ कुछ न्यूनतम इस पुन: पेश करने कोड है। विजुअल स्टूडियो में एक नया WPF एप्लिकेशन बनाएं, और इसे प्री-जेनरेट किया गया MainWindow.xaml.cs
फिर, केवल एक विंडो खोलने के लिए कीबोर्ड पर एक कुंजी दबाएं, इसे बंद करें, अपेक्षित व्यवहार करें। दो कुंजियां दबाएं, दोनों को बंद करें, फिर पहली विंडो विजुअल स्टूडियो (संभवतः) के पीछे है।
public MainWindow()
{
InitializeComponent();
this.PreviewKeyDown += (sender, e) =>
{
if (this.Owner is MainWindow)
{
// we're the SubWindow
MessageBox.Show("I am a modal dialog");
// code below produces the exact same behavior as the message box
//var dialog = new MainWindow();
//dialog.Owner = this;
//dialog.ShowDialog();
}
else
{
// we're the initial MainWindow created by App.
var subWindow = new MainWindow();
subWindow.Owner = this;
subWindow.Show();
}
};
}
क्या यह हम लायक है के लिए एक सादे WinForms में इस बग देखा (.NET 2) आवेदन के बारे में मैं पर काम किया 5 साल पहले। मैंने आज एक नई परियोजना (.NET 4.5) में इसे फिर से चलाया है। मुझे लगता है कि 'दिखाएँ()' नेस्टेड 2-गहरा या अधिक होने पर बग टिका है। ऐसा लगता है कि अन्य लोगों ने भी इसमें भाग लिया है ([यहां] (http://www.pcreview.co.uk/forums/vbulletin-2005- विन्डोज़-app-goes-back-z-order-after-dialog-box- clo-t3140486.html) और [यहां] (http://web1.codeproject.com/Messages/1813163/Application-Goes-to-Back-of-ZOrder-after-cloasing-.aspx)); अगर मुझे याद है कि हमने @ हंस की तरह एक कामकाज का उपयोग किया है। –
बस आपको बताने के लिए, आपका कोड अनंत लूप का कारण बनता है। मैं केवल कल्पना कर सकता हूं कि 'base.OnClosing' एक वर्चुअल फ़ंक्शन है जिसे आप जिस विधि को बुला रहे हैं, उसमें लागू किया गया है, इसलिए स्वयं को कॉल करना। – Steztric
एक और बात, 'समापन' घटना को संभालने से समस्या मेरे लिए समस्या का समाधान नहीं करती है - मुझे 'बंद' ईवेंट को संभालने की आवश्यकता है। – Steztric