किसी एप्लिकेशन में, मुझे एकाधिक पॉपअप खोलने की आवश्यकता है लेकिन यह जांचने की आवश्यकता है कि किसी दिए गए संदर्भ (गाइड) के साथ पॉपअप पहले से मौजूद है या नहीं। यदि ऐसा है, तो मैं पहले मौजूदा पॉपअप को बंद कर दूंगा और एक नया खोलूंगा। मैं नीचे दिए गए कोड का उपयोग कर रहा हूं लेकिन ऐसा लगता है कि जब भी कोई नया पॉपअप बनाया जाता है तो मेरा आंशिक वर्ग चर ग्रिड रीसेट हो जाता है और इसलिए MRwin.GetGuid() == this.guid की स्थिति हमेशा सत्य होती है। यह ऐसा है जैसे कि guid चर को स्थिर घोषित किया गया था :-S कोई विचार?

public partial class MyPopup: MetroWindow 
{
  private Guid guid;

  public Guid GetGuid() 
  {
    return guid;
  }

  public MyPopup(Guid guid) 
  {
    InitializeComponent();
    this.guid = guid;

    foreach(var win in Application.Current.Windows) 
    {
      if (win is Forms.MyPopup) 
      {
        Forms.MyPopup cWin = (Forms.MyPopup) win;

        // Close if there is any open popup window related to the same Guid
        if (cWin.GetGuid() == this.guid) 
        {
          cWin.Close();
        }
      }
    }
  }
}
c#
1
Salim 26 मार्च 2020, 09:52
1
आपके द्वारा प्रदान किया गया कोड संकलित नहीं होगा - आप एक string मान को एक Guid चर में निर्दिष्ट करने का प्रयास कर रहे हैं। पठनीयता के लिए, मैं यह भी अनुशंसा करता हूं कि आप अपने कोड को प्रारूपित करें - कम से कम स्टैक ओवरफ़्लो पर - अधिक पारंपरिक सी # तरीके से। (मैं GetGuid विधि के बजाय किसी संपत्ति का उपयोग करने का भी सुझाव दूंगा...)
 – 
Jon Skeet
26 मार्च 2020, 09:55
ध्यान दें कि हम नहीं जानते कि कंस्ट्रक्टर पैरामीटर क्या प्रदान कर रहा है। यदि हर बार एक ही मान पारित किया जा रहा है, तो निश्चित रूप से, सभी विंडो समान होंगी... कृपया एक minimal प्रदान करें प्रतिलिपि प्रस्तुत करने योग्य उदाहरण ताकि हम आपकी सहायता कर सकें।
 – 
Jon Skeet
26 मार्च 2020, 09:55
टाइपो? आप कंस्ट्रक्टर में एक स्ट्रिंग मान के साथ ग्रिड प्रकार फ़ील्ड असाइन करते हैं
 – 
Hans Kesting
26 मार्च 2020, 09:57
आप उन पॉपअप के लिए गाइड कैसे निर्दिष्ट कर रहे हैं? क्या आप निश्चित हैं कि वे अलग हैं?
 – 
Hans Kesting
26 मार्च 2020, 09:59
हाय हंस, जॉन, आपकी त्वरित प्रतिक्रिया के लिए धन्यवाद। कोड को सरल बनाने में किए गए टाइपो के लिए क्षमा करें, इसे अपडेट किया गया है। हां, मान अलग हैं: जब मैं नया पॉपअप बनाता हूं, तो मैं ग्रिड का एक प्रिंट करता हूं जो हर बार अलग होता है। फिर, जब गाइड को फ़ॉर्म के माध्यम से लूप के माध्यम से एक्सेस किया जाता है, तो ऐसा लगता है कि वे मिटा दिए गए हैं और मैं यह नहीं समझ सकता कि क्यों/कब।
 – 
Salim
26 मार्च 2020, 11:40

2 जवाब

सबसे बढ़िया उत्तर

अंत में, Application.Current.Windows में निश्चित रूप से थ्रेडिंग के कारण खुली हुई खिड़कियों में से एक शामिल नहीं था। इस मुद्दे को हल करने के लिए मैंने एक स्थिर सूची का उपयोग करके खुली खिड़कियों की सूची बनाने और बनाए रखने का निर्णय लिया।

0
Salim 26 मार्च 2020, 15:33

यह कंस्ट्रक्टर के लिए एक बुरा काम है। यदि आपको विंडो बनाने की आवश्यकता नहीं है, तो इसे न बनाएं। इसे बनाना और फिर बंद करना उचित नहीं है। और यह आपकी समस्या का कारण बनता है, क्योंकि आपकी नई बनाई गई आंशिक रूप से विंडो पहले से ही Application.Current.Windows सूची में है!

कंस्ट्रक्टर में इस तरह के लॉजिक होने के बजाय, एक स्टैटिक मेथड (या फ़ैक्टरी) का उपयोग करें:

public static MyPopup OpenPopup(Guid guid) =>
  Application.Current.Windows
    .OfType<Forms.MyPopup>()
    .FirstOrDefault(w => w.GetGuid() == guid)
  ?? new MyPopup(guid);

(यदि आप किसी मौजूदा पॉपअप का संदर्भ नहीं देना चाहते हैं तो बेझिझक null लौटाएं)।

3
Luaan 26 मार्च 2020, 10:03
धन्यवाद। जरूरत वास्तव में थोड़ी अलग है। एक ट्रिगर के आधार पर, मुझे या तो एकाधिक पॉपअप मानों को अपडेट/रीफ्रेश करने की आवश्यकता है या (विकल्प जिसे मैंने चुना है), विशिष्ट पॉपअप को बंद करें और रीफ्रेश किए गए मानों के साथ एक नया खोलें। वैसे भी, मैंने आपके दृष्टिकोण की कोशिश की लेकिन ऐसा लगता है कि स्थिर विधि का उपयोग करते समय Application.Current.Windows सेट नहीं है।
 – 
Salim
26 मार्च 2020, 11:36
ठीक है, इसलिए मैंने इस मुद्दे की पहचान की: Application.Current.Windows कभी-कभी सक्रिय फॉर्म में से एक को वापस करने से चूक जाता है। ऐसा लगता है कि पहले खोला गया था लेकिन मुझे यकीन नहीं है कि क्यों ... मेरे पास मुख्य धागे में कन्स्ट्रक्टर को एक ही कॉल है। +1 उपयोगी के लिए "नवीन आंशिक रूप से बनाई गई विंडो पहले से ही एप्लिकेशन में है। करंट। विंडोज सूची!"
 – 
Salim
26 मार्च 2020, 12:57
क्या आप UI थ्रेड पर सभी विंडो बना रहे हैं? मल्टी-थ्रेडेड UI से निपटना बहुत मुश्किल है। Application.Current.Windows वर्तमान थ्रेड पर बनाई गई सभी विंडो का ट्रैक रखता है।
 – 
Luaan
26 मार्च 2020, 14:13
1
एप्लिकेशन थ्रेड-सुरक्षित है। क्या आप वाकई कंस्ट्रक्टर्स (या स्टैटिक कंस्ट्रक्टर्स) में कुछ अजीब नहीं कर रहे हैं? क्या सभी विंडोज़ डब्ल्यूपीएफ विंडोज़ हैं? यह भी ध्यान रखें कि आपके द्वारा बनाई गई पहली विंडो Application.Current.MainWindow बन जाती है, इसलिए पहली विंडो हमेशा थोड़ी खास होती है।
 – 
Luaan
27 मार्च 2020, 14:14
1
मुझे नहीं पता कि आउटलुक ऐड-इन्स का थ्रेडिंग/डोमेन मॉडल क्या है, क्षमा करें :) यह निश्चित रूप से एक विशेष मामला है जो आप जो करने की कोशिश कर रहे हैं उस पर अप्रत्याशित प्रभाव डाल सकता है।
 – 
Luaan
4 अप्रैल 2020, 17:21