2013-04-09 21 views
5

Ich habe einige MessageBox, die ich wie folgt Code:C#, Windows Form, Messagebox oben nicht funktioniert

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

Für ein besseres Beispiel, ich tue dies für die Formclosing Veranstaltung:

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

Aber fast jedes Mal, wenn ich Window auf meinem Computer ändern muss (wie bei Visual Studio), bevor ich meine MessageBox sehe, ist das nicht benutzerfreundlich und wirklich nervig.

Ich verifiziert, dass meine Hauptform nicht in TopMost = true war, habe ich nur die TopMost oder nur die TopLevel, die StartPosition = FormStartPosition.CenterScreen versucht, aber nichts hat funktioniert.

[Update]

Ich habe versucht:

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

Ich möchte meine messageBox auf der vor meinem Fenster haben und müssen nicht von Fenster ändern, es zu sehen, weil es wie hinter dem aktuellen Fenster.

Haben Sie eine Idee, dieses Problem zu lösen?

+0

Bitte seien Sie klarer, nicht sicher, was Sie verlangen. – Harish

+0

Was möchten Sie erreichen? – Max

+0

Besitzer muss zuerst angezeigt werden. – JSJ

Antwort

3

eine Instanz Ihrer Form Da Sie eine MessageBox wie folgt aufrufen können:
MessageBox.show(form, "Message", "Title"); (Check the doc for other parameters.)

jedoch, wenn Sie diese anrufen aus einem Hintergrundthread möchten (z: BackgroundWorker) müssen Sie Form.Invoke() wie folgt verwenden:

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

Sie setzen den MessageBox Besitzer auf ein neues Formular, das nicht angezeigt wurde. Verwenden Sie anstelle von new Form(){TopMost=true, TopLevel=True} eine Instanz eines vorhandenen Formulars, das MessageBox oben angezeigt werden soll.

+0

Ich benutzte meine Messagebox in der Ansicht des Besitzers Fenster. Meintest du so: MessageBox.Show (this.owner, .....)? – Alice

+0

Wenn Sie es von einem Formular aus aufrufen, wäre nur "MessageBox.Show (this, ...' "korrekt. Das heißt, wenn Sie es aus einem Formular aufrufen, glaube ich, dass der Besitzer implizit ist, damit Sie es weglassen können – MrBlue

+0

Das ist kein Problem, den Besitzer hinter der Nachrichtenbox zu sehen, das ist der Punkt, aber hier muss ich das Programm wechseln (gehe zu Visual Studio oder Büro, ...) und dann sah ich meine Nachrichtenbox, als ich zurückkam auf meiner Anwendung – Alice

8

Machen Sie es wie folgt aus:

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

Es wird vor allen anderen Fenstern setzen, auch aus anderen Prozessen (das ist, was ich denke, nach dem Sie fragen).

Der kritische Parameter ist MessageBoxOptions.DefaultDesktopOnly. Beachten Sie, dass dadurch das Meldungsfeld auf dem Standarddesktop übergeordnet wird, sodass die Anwendung MessageBox.Show() den Fokus verliert.

(Sie sollten wirklich dieses Verhalten für kritische Meldungen reservieren.)

Alternativ, wenn Ihre Anwendung ein Fenster hat, rufen this.BringToFront() bevor das Meldungsfeld zeigt, die von MessageBox.Show() mit dem ersten Parameter auf this Aufruf . (Sie würden dies aus der Fensterformklasse aufrufen).

+0

Danke für den Tipp, aber ja, ein bisschen zu drastisch – Alice

+0

Nun, es ist nicht drastischer als es auf eine andere Art zu tun (dh das Fenster vor allen anderen Fenstern auf dem System zu setzen). Alternative, Vielleicht möchten Sie Ihre Anwendung selbst in den Vordergrund stellen. –

+0

Ja, aber ich benutze MessageBox für viele Dinge und leider sind alle wichtig, aber ich kann den Fokus auf das Hauptfenster auch verlieren ... Aber deine Lösung ist großartig in einigen Fällen und ich werde sie wahrscheinlich sehr bald benutzen! – Alice

-1

tun Sie das einfach wie normal (MessageBox.Show(Message);) es ist bereits am obersten.

Informationen siehe here und here.

+0

Ich habe das zuerst versucht .. Hat nicht funktioniert – Alice

0

Weitere Lars' Antwort, ich das gleiche Problem und Lars hatte Methode gearbeitet, aber wenn ich eine Nachricht tauchte dann an anderer Stelle aus, die nicht auf war oben, darauf umgeschaltet, und dann wurde die Nachricht erneut mit Lars 'Methode aufgerufen, sie wäre nicht mehr oben.

Dies ist die Variante, die ich mit, dass für mich gut funktioniert kam, hoffen, dass Sie es nützlich finden:

Dieses wird von einem separaten Thread ausgeführt wird, die einen Verweis auf die Hauptanwendung Formularinstanz hat

//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

ich diese here beantwortet haben (aber da es eine ziemlich kleine Antwort ist, werde ich es replizieren):

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

Versuchen sie, schreibe verallgemeinern Logik als: -

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)); 
}