2013-04-09 5 views
5
विंडोज फार्म, संदेशबॉक्स शीर्ष पर काम नहीं कर

मैं कुछ MessageBox कि मैं इस तरह कोड है:सी #,

MessageBox.Show(new Form(){TopMost=true, TopLevel=True}, "Message","Title", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); 

एक बेहतर उदाहरण के लिए, मैं इस FormClosing घटना के लिए कार्य करें:

private void Example_FormClosing(object sender, FormClosingEventArgs e){ 
MessageBox.Show(new Form(){TopMost=true, TopLevel=True}, "Really close?"," Program", MessageBoxButtons.OKCancel, MessageBoxIcon.Information); 
} 

लेकिन, मेरे संदेश बॉक्स को देखने से पहले लगभग हर बार मुझे अपने कंप्यूटर पर विंडो (जैसे विजुअल स्टूडियो पर वापसी) बदलना पड़ता है और यह उपयोगकर्ता के अनुकूल और वास्तव में परेशान नहीं है।

मैंने सत्यापित किया कि मेरा मुख्य रूप TopMost = true में नहीं था, मैंने केवल टॉपमोस्ट या केवल टॉपलेवल, StartPosition = FormStartPosition.CenterScreen की कोशिश की लेकिन कुछ भी काम नहीं किया।

[अपडेट]

मैंने कोशिश की:

private void Example_FormClosing(object sender, FormClosingEventArgs e){ 
    MessageBox.Show(this.Owner, "Really close?"," Program", MessageBoxButtons.OKCancel, MessageBoxIcon.Information); 
    } 

मैं अपनी खिड़की से मोर्चे पर मेरी संदेशबॉक्स के लिए और खिड़की के बदलने के लिए यह देखने के लिए, क्योंकि यह नहीं चाहते हैं वर्तमान खिड़की के पीछे की तरह।

क्या आप इस समस्या को हल करने का विचार रखते हैं?

+0

कृपया और स्पष्ट रहें, सुनिश्चित करें कि आप क्या पूछ रहे हैं। – Harish

+0

आप क्या हासिल करना चाहते हैं? – Max

+0

मालिक को पहले दिखाया जाना चाहिए। – JSJ

उत्तर

3

अपने Form का एक उदाहरण को देखते हुए, आप एक MessageBox इस तरह कॉल कर सकते हैं:
MessageBox.show(form, "Message", "Title"); (Check the doc for other parameters.)

हालांकि यदि आप एक पृष्ठभूमि धागे से इस कॉल करना चाहते हैं (उदाहरण के लिए: BackgroundWorker) आप Form.Invoke() इस तरह उपयोग करने के लिए:

form.Invoke((MethodInvoker)delegate 
{ 
    MessageBox.show(form, "Message", "Title"); 
}); 
0

आप MessageBox स्वामी को एक नए फॉर्म में सेट कर रहे हैं जो दिखाया नहीं गया है। new Form(){TopMost=true, TopLevel=True} के बजाय, किसी मौजूदा फ़ॉर्म का उदाहरण देखें जिसे आप MessageBox के शीर्ष पर चाहते हैं।

+0

पर काम करने के लिए जारी रखें मैंने मालिक संदेश विंडो के दृश्य में अपना संदेशबॉक्स उपयोग किया। क्या आपका मतलब यह था: MessageBox.Show (this.owner, .....)? – Alice

+0

यदि आप इसे किसी फ़ॉर्म से कॉल कर रहे हैं, तो बस 'MessageBox.Show (यह, ...' सही होगा। उसने कहा, अगर आप इसे एक फॉर्म से कॉल कर रहे हैं तो मेरा मानना ​​है कि मालिक को निहित किया गया है ताकि आप इसे छोड़ सकें पूरी तरह से – MrBlue

+0

संदेशबॉक्स के पीछे मालिक को देखने में कोई समस्या नहीं है, यह बात है। लेकिन यहां, मुझे प्रोग्राम बदलना है (दृश्य स्टूडियो या कार्यालय में जाना है ...) और फिर जब मैं वापस आया तो मैंने अपना संदेशबॉक्स देखा मेरे आवेदन पर – Alice

8

इसे इस तरह कार्य करें:

MessageBox.Show(
    "Message", 
    "Title", 
    MessageBoxButtons.YesNo, 
    MessageBoxIcon.Warning, 
    MessageBoxDefaultButton.Button1, 
    MessageBoxOptions.DefaultDesktopOnly); 

यह अन्य प्रक्रियाओं से उन (जो कि मैं क्या लगता है कि आप के लिए पूछ रहे हैं) सहित अन्य सभी खिड़कियां, के सामने रख दिया जाएगा।

महत्वपूर्ण पैरामीटर MessageBoxOptions.DefaultDesktopOnly है। ध्यान दें कि यह डिफ़ॉल्ट डेस्कटॉप पर संदेश बॉक्स को अभिभावक करेगा, जिससे फोकस खोने के लिए एप्लिकेशन MessageBox.Show() पर कॉल कर रहा है।

(आप वास्तव में महत्वपूर्ण संदेश के लिए इस व्यवहार को आरक्षित करना चाहिए।)

वैकल्पिक रूप से, अगर आपके आवेदन एक खिड़की है, पहले पैरामीटर this करने के लिए सेट के साथ MessageBox.Show() कॉल करके संदेश बॉक्स दिखाने से पहले फोन this.BringToFront() । (आप इसे विंडो फॉर्म क्लास से कॉल करेंगे)।

+0

टिप के लिए धन्यवाद लेकिन हाँ, थोड़ा बहुत कठोर – Alice

+0

वैसे यह इसे किसी अन्य तरीके से करने से अधिक कठोर नहीं है (यानी सिस्टम पर अन्य सभी विंडोज़ के सामने खिड़की डालना) वैकल्पिक रूप से, आप अपने आवेदन को अग्रभूमि में रखना चाहते हैं। –

+0

हां, लेकिन मैं कई चीजों के लिए संदेशबॉक्स का उपयोग करता हूं और दुर्भाग्यवश, सभी महत्वपूर्ण हैं लेकिन मैं प्रिंसिपल विंडो पर भी ध्यान केंद्रित कर सकता हूं ... लेकिन आप कुछ मामलों में समाधान बहुत अच्छे हैं और शायद मैं इसे जल्द ही उपयोग करता हूं! – Alice

-1

बस सामान्य के रूप में ऐसा करें (MessageBox.Show(Message);) यह पहले से ही सबसे ऊपर है।

जानकारी के लिए here और here देखें।

+0

मैंने पहले कोशिश की .. काम नहीं किया – Alice

0
लार्स को

इसके अलावा 'जवाब, मैं एक ही समस्या थी और लार्स' विधि काम किया, लेकिन अगर मैं तो कहीं और से कोई संदेश को पॉप कि पर नहीं था शीर्ष, इसे स्विच किया गया, और फिर संदेश को लार्स की विधि का उपयोग करके बुलाया गया था, यह अब शीर्ष पर नहीं होगा।

यह भिन्नता है कि मुझे लगता है कि के साथ आया था मेरे लिए अच्छी तरह से काम करता है, आशा है कि आप पाते हैं यह उपयोगी:

यह एक अलग थ्रेड, मुख्य आवेदन पत्र उदाहरण के लिए एक संदर्भ है कि से चलाया जाता है

//Show message on top of all other forms 
MainFormInstance.Invoke((MethodInvoker)delegate 
{ 
    Form popup = new Form() { TopMost = true, TopLevel = true }; 
    MessageBox.Show(popup, "Message", "Title"); 
}); 
2

मेरे द्वारा उत्तरित इस here (लेकिन क्योंकि यह एक काफी छोटा सा जवाब है, मैं इसे दोहराने जाएगा):

using (var dummy = new Form() { TopMost = true }) 
{ 
    MessageBox.Show(dummy, text, title); 
} 
0

करने की कोशिश करो सामान्यीकृत तर्क लिखें: -

public static DialogResult ShowMessage(Form Parent, string Text, string Caption, MessageBoxButtons Buttons, MessageBoxIcon Icon, MessageBoxDefaultButton DefaultButton) 
{ 
    if (Parent != null && Parent.InvokeRequired) 
     return (DialogResult) Parent.Invoke(((Func<DialogResult>))(() => MessageBox.Show(Text, Caption, Buttons, Icon, DefaultButton))); 
    else 
     return (MessageBox.Show(Text, Caption, Buttons, Icon, DefaultButton)); 
}