2012-05-31 20 views
8

से एक संवाद विंडो को कैसे रोक सकता हूं यदि मैं System.Windows.Window से प्राप्त कक्षा बना देता हूं और इसे ShowDialog के साथ दिखाता हूं तो यह मुख्य विंडो के ऊपर दिखाई देता है, और मुख्य विंडो अक्षम है। हालांकि अन्य अनुप्रयोगों के पीछे दोनों खिड़कियां रखना संभव है, और फिर मुख्य विंडो को वापस लाएं। यह सिर्फ एक खिड़की छोड़ देता है जो दुर्घटनाग्रस्त प्रतीत होता है, और भ्रमित हो सकता है।मैं छिपी हुई

क्या यह सुनिश्चित करना संभव है कि मुख्य विंडो दिखाए जाने पर संवाद विंडो हमेशा प्रदर्शित होती है? MessageBox.Show संवाद ऐसी कोई समस्या

है

अद्यतन:

एक परीक्षण संवाद

public partial class MyDialog : Window 
{ 
    public MyDialog() 
    { 
     InitializeComponent(); 
    } 
} 

के रूप में परिभाषित किया गया है और

MyDialog d = new MyDialog(); 
    d.ShowDialog(); 
+0

आप उपयोग पर्चा :: ShowDialog (IWin32Window) विधि क्या इस कोड को काम करना चाहिए? जैसा कि आप उम्मीद करते हैं मालिक मालिक खिड़की के साथ संवाद व्यवहार करना चाहिए। –

+0

मैं प्रपत्र का उपयोग नहीं कर रहा हूं, इसकी एक प्रणाली है। Windows.Window, और ShowDialog कोई पैरामीटर नहीं लेता –

उत्तर

7

आपको मालिक संपत्ति सेट करनी है।

MyDialog d = new MyDialog(); 
d.Owner = Application.Current.MainWindow;//or your owning window 
d.ShowDialog(); 
+0

मैं अपने WPF एप्लिकेशन में 'पॉपअपविंडोएक्शन' का उपयोग कर रहा हूं। _owner_ को _current मुख्य विंडो_ पर सेट करना, विन्डोज़ संदेशबॉक्स_ से वर्णित वर्णित व्यवहार प्राप्त करने की कुंजी थी। (धन्यवाद, मैंने एक घंटे की खोज की है ...!) – RamNow

1

का उपयोग कर बुलाया यह सुनिश्चित करें कि संवाद खिड़की मुख्य खिड़की दिखाई देने पर हमेशा प्रदर्शित होता है, TopMost टी सेट करने के लिए मुख्य रूप दृश्यता में हैंडलर को परिवर्तित करें रुए या गलत बच्चे फार्म के लिए मुख्य दृश्यता

ChildForm frmDLg = null; 
public MainForm() 
{ 
    this.VisibleChanged += MainFrmVisibleChanged; 
} 

private void LoadDialogForm() 
{ 
    try { 
     if (frmDLg == null || frmDLg.IsDisposed) { 
      frmDLg = new ChildForm(); 
     } 
     frmDLg.ShowDialog(); 
    } catch (Exception ex) { 
     //Handle exception 
    } 
} 

private void MainFrmVisibleChanged(object sender, System.EventArgs e) 
{ 
    if (frmDLg != null && !frmDLg.IsDisposed) { 
     frmDLg.TopMost = this.Visible; 
    } 
} 

अद्यतन

public override bool Visible 
     { 
      get 
      { 
       return base.Text; 
      } 
      set 
      { 
       base.Text = value; 
       // Insert my code 
       if (frmDLg != null && !frmDLg.IsDisposed) 
       { 
        frmDLg.TopMost = this.Visible; 
       } 
      } 
     } 

पिछले इलाज मुझे लगता है कि कर सकते हैं अगर मुख्य रूप से दिखाई देता है की जाँच करने के user32 dll getforegroundwindow के साथ एक टाइमर का उपयोग करने के लिए है के अनुसार।

+0

मैं System.Windows.Window का उपयोग नहीं कर रहा हूं, और इसमें कोई दृश्य परिवर्तनीय ईवेंट प्रॉपर्टी नहीं है। यह स्पष्ट करने के लिए खेद है कि –

+0

क्षमा करें, मुझे सिस्टम नहीं मिल सकता है। विंडो 3.5 डॉट नेट 3.5 में, किसी भी तरह से यदि आप विंडो पा सकते हैं। दृश्यमान संपत्ति इसलिए इसे ओवरराइड करने का प्रयास करें, इसलिए मेरे 'MainFrmVisibleChanged' दृश्यमान संपत्ति के सेट का उपयोग करें वहां अपडेट करें –

+1

विवरण http://msdn.microsoft.com/en-us/library/system.windows.window.aspx सुझावों के लिए धन्यवाद, लेकिन सेटिंग मेरे मामले के लिए समस्या का समाधान करती है। –

1

के रूप में आप चाहते हैं

public MainWindow() 
    { 
     InitializeComponent(); 

     this.Activated += new EventHandler(MainWindow_Activated); 
    } 

    void MainWindow_Activated(object sender, EventArgs e) 
    { 
     if (m == null) 
      return; 

     m.Activate(); 
    } 


    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     m = new MyDialog(); 
     m.ShowDialog(); 
    } 
    MyDialog m; 
+0

यह धन्यवाद, लेकिन मालिक को सेट करना थोड़ा आसान है –

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