2012-11-03 8 views
11

मैंने एक WPF एप्लिकेशन में यह बहुत ही अजीब व्यवहार देखा है।एक अन्य विंडो के बाद मुख्य विंडो अन्य एप्लिकेशन की खिड़कियों के पीछे गायब हो जाती है, एक तीसरी विंडो पर ShowDialog का उपयोग करता है

मेरे पास MainWindow है, जो App.OnStartup से Show() का उपयोग करके दिखाया गया है। MainWindow एक (गैर मोडल) SubWindow खोल सकते हैं, भी Show() का उपयोग कर कहा। SubWindow का OwnerMainWindow पर सेट है।

जब SubWindow बंद कर दिया है, MainWindow दिखाई फिर से (अच्छा) है।

कुछ कार्यों (OwnerSubWindow पर सेट है) 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(); 
     } 
    }; 
} 

उत्तर

9

यह एक बहुत कष्टप्रद WPF बग है मैं कभी नहीं कोड है कि यह कारण बनता में दोष मिला लेकिन वहाँ "होगा आंकड़ा इस बाहर" स्रोत कोड है कि ध्यान केंद्रित के साथ सौदों में टिप्पणियों का एक heckofalot है। बस एक वर्कअराउंड, आदर्श से कम, आप खिड़की बंद होने पर स्पष्ट रूप से मालिक को ध्यान देकर इसे हल कर सकते हैं। इस कोड को अपनी सबविंडो कक्षा में कॉपी/पेस्ट करें;

protected override void OnClosing(System.ComponentModel.CancelEventArgs e) { 
     base.OnClosing(e); 
     if (!e.Cancel && this.Owner != null) this.Owner.Focus(); 
    } 
+1

क्या यह हम लायक है के लिए एक सादे 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)); अगर मुझे याद है कि हमने @ हंस की तरह एक कामकाज का उपयोग किया है। –

+0

बस आपको बताने के लिए, आपका कोड अनंत लूप का कारण बनता है। मैं केवल कल्पना कर सकता हूं कि 'base.OnClosing' एक वर्चुअल फ़ंक्शन है जिसे आप जिस विधि को बुला रहे हैं, उसमें लागू किया गया है, इसलिए स्वयं को कॉल करना। – Steztric

+0

एक और बात, 'समापन' घटना को संभालने से समस्या मेरे लिए समस्या का समाधान नहीं करती है - मुझे 'बंद' ईवेंट को संभालने की आवश्यकता है। – Steztric

0

खिड़की को छिपाने के साथ ही एक ही समस्या को दबाएं। मैं नहीं देख सकते हैं इस स्थिति में बंद करने के लिए एक समान घटना है कि वहाँ है, लेकिन फिर भी इस काम करता है:

 if (Owner != null) Owner.Focus(); 
     Hide(); 
संबंधित मुद्दे