Können Sie nicht einfach ChildForm.show und dann Mainform.disable / .hide verwenden oder sprechen Sie davon, dass zwei Formulare gleichzeitig aktiv sind und wenn das untergeordnete Formular aktiviert ist (aktiv, um das Hauptformular zu deaktivieren), aktivieren Sie das Hauptformular erneut (nicht fokussieren) ?
Don Thomas Boyle
@DonThomasBoyle: Hey Mann, ich suche genau Ihre beschriebene Lösung "Wenn 2 Formulare gleichzeitig aktiv sind und wenn das untergeordnete Formular aktiv ist (aktiv, um das Hauptformular zu deaktivieren), dann aktivieren Sie das Hauptformular auf (nicht fokussieren)" können Sie mir geben ein Hinweis, wie man das löst? Ich habe es mit Threading, application.run usw. versucht, aber nichts funktioniert. Wie würden Sie das realisieren?
@barlop, um die Verwendung this.Hide()des übergeordneten Formulars im übergeordneten Formularcode auszublenden .
Vee
@vee Du hast mich falsch verstanden. Ich fragte, warum es so schien, als würde es sich verstecken (wenn ich es nicht wollte). Mein Problem, behoben, war dieses stackoverflow.com/questions/38171607/…
barlop
Danke @R. Martinho Fernandes, das funktioniert einwandfrei!
Jemil Oyebisi
37
Rufen Sie an ShowDialog()oder nur Show()auf Ihrem Kinderformular aus dem Elternformular?
ShowDialogblockiert den Benutzer für die Interaktion mit dem Formular, das als Parameter an übergeben wird ShowDialog.
Innerhalb des Elternteils könnten Sie so etwas nennen wie:
MyChildForm childForm = new MyChildForm();
childForm.ShowDialog(this);
Funktioniert bei mir! VB.Net-Version ist dies: Public childForm As New Childformclassund childForm.ShowDialog(Me)wo ich die Klasse Eltern (Elternform) ist, vielen Dank @Philip
Ignacio Bustos
15
Es ist einfach zu bedienen
Form.ShowDialog();
Stattdessen
Form.Show();
Während der Verwendung können Form.ShowDialog()Sie nicht mit dem übergeordneten Formular interagieren, bis es geschlossen wird.
Dies führt jedoch zu einem wirklich seltsamen Verhalten. Während Sie nicht sofort zurückkehren und mit dem übergeordneten Formular interagieren können, wird es durch Aktivieren einer anderen Anwendung aktiviert, und der Benutzer kann dann mit ihm interagieren.
Wenn Sie das untergeordnete Formular modal machen möchten , verwenden Sie ShowDialogstattdessen:
Form newForm = new ChildForm();
newForm.ShowDialog(this);
Sie können auch Form_Closed anstelle von Form_Deactivate verarbeiten, wenn Sie das übergeordnete Formular für die Lebensdauer des untergeordneten Formulars deaktivieren möchten, unabhängig davon, ob andere Formulare oder Anwendungen in der Zwischenzeit aktiviert werden.
JamesFaix
8
Während Sie das zuvor erwähnte childForm.ShowDialog (this) verwenden, wird Ihr Hauptformular deaktiviert, es sieht jedoch immer noch sehr deaktiviert aus. Wenn Sie jedoch Enabled = false vor ShowDialog () und Enable = true nach dem Aufruf von ShowDialog () aufrufen, sieht das Hauptformular sogar so aus, als wäre es deaktiviert.
var childForm = new Form();
Enabled = false;
childForm .ShowDialog(this);
Enabled = true;
Entschuldigung, dies ist kein C # -Code, aber dies ist das, was Sie möchten. Außerdem sollte die Übersetzung einfach sein.
FORM 1
Private Sub Form1_MouseEnter(sender As Object, e As EventArgs) Handles MyBase.MouseEnter
Me.Focus()
Me.Enabled = True
Form2.Enabled = False
End Sub
Private Sub Form1_MouseLeave(sender As Object, e As EventArgs) Handles MyBase.MouseLeave
Form2.Enabled = True
Form2.Focus()
End Sub
FORM2
Private Sub Form2_MouseEnter(sender As Object, e As EventArgs) Handles MyBase.MouseEnter
Me.Focus()
Me.Enabled = True
Form1.Enabled = False
End Sub
Private Sub Form2_MouseLeave(sender As Object, e As EventArgs) Handles MyBase.MouseLeave
Form1.Enabled = True
Form1.Focus()
End Sub
Danke vielmals! Ihre Idee ist großartig! Ich habe gerade herausgefunden, dass es auch funktioniert, indem ich mit Eltern arbeite und Kinder an sie andocke.
ア ロ デ ィ
4
Sie können dies mit folgendem tun:
Form3 formshow = new Form3();
formshow.ShowDialog();
Wenn Sie nur versuchen, einen Form.ShowDialog-Aufruf zu simulieren, aber OHNE irgendetwas zu blockieren (ein bisschen wie ein simuliertes Dialogformular), können Sie Form.Show () verwenden. Sobald Sie das simulierte Dialogformular anzeigen, deaktivieren Sie sofort alle anderen Fenster mit etwas wie...
privatevoidDisableAllWindows()
{
foreach (Form f in Application.OpenForms)
if (f.Name != this.Name)f.Enabled = false;
else f.Focus();
}
Wenn Sie dann Ihr "Pseudo-Dialogformular" schließen, rufen Sie unbedingt ....
privatevoidEnableAllWindows()
{
foreach (Form f in Application.OpenForms) f.Enabled = true;
}
Bei dieser Antwort geht es um PROZESSE, nicht um FORMEN. Nützlich für jemanden, geht aber nicht auf die Frage ein. Es ist auch eine wirklich schlechte Idee, wenn dies über den GUI-Thread erfolgt - Ihre App-GUI wird gesperrt, bis der andere Prozess zurückkehrt -, wenn etwas schief geht, muss der Benutzer auf den Task-Manager zurückgreifen, um Ihre App zu beenden. MIT VORSICHT VERWENDEN! Oder noch besser: Verwenden Sie eine ASYNCHRONOUS-Lösung anstelle von WaitForExit.
Antworten:
Haben Sie versucht, Form.ShowDialog () anstelle von Form.Show () zu verwenden ?
ShowDialog zeigt Ihr Fenster als modal an. Dies bedeutet, dass Sie erst mit dem übergeordneten Formular interagieren können, wenn es geschlossen wird.
quelle
this.Hide()
des übergeordneten Formulars im übergeordneten Formularcode auszublenden .Rufen Sie an
ShowDialog()
oder nurShow()
auf Ihrem Kinderformular aus dem Elternformular?ShowDialog
blockiert den Benutzer für die Interaktion mit dem Formular, das als Parameter an übergeben wirdShowDialog
.Innerhalb des Elternteils könnten Sie so etwas nennen wie:
MyChildForm childForm = new MyChildForm(); childForm.ShowDialog(this);
Wo
this
ist das übergeordnete Formular?quelle
Public childForm As New Childformclass
undchildForm.ShowDialog(Me)
wo ich die Klasse Eltern (Elternform) ist, vielen Dank @PhilipEs ist einfach zu bedienen
Stattdessen
Während der Verwendung können
Form.ShowDialog()
Sie nicht mit dem übergeordneten Formular interagieren, bis es geschlossen wird.quelle
Sie können sicherstellen, dass Sie das übergeordnete Formular als Eigentümer übergeben, wenn Sie das untergeordnete Formular anzeigen:
Form newForm = new ChildForm(); newForm.Show(this);
Richten Sie dann in der untergeordneten Form Ereignishandler für die Ereignisse
Activated
und einDeactivate
:private void Form_Activated(object sender, System.EventArgs e) { if (this.Owner != null) { this.Owner.Enabled = false; } } private void Form_Deactivate(object sender, System.EventArgs e) { if (this.Owner != null) { this.Owner.Enabled = true; } }
Dies führt jedoch zu einem wirklich seltsamen Verhalten. Während Sie nicht sofort zurückkehren und mit dem übergeordneten Formular interagieren können, wird es durch Aktivieren einer anderen Anwendung aktiviert, und der Benutzer kann dann mit ihm interagieren.
Wenn Sie das untergeordnete Formular modal machen möchten , verwenden Sie
ShowDialog
stattdessen:Form newForm = new ChildForm(); newForm.ShowDialog(this);
quelle
Während Sie das zuvor erwähnte childForm.ShowDialog (this) verwenden, wird Ihr Hauptformular deaktiviert, es sieht jedoch immer noch sehr deaktiviert aus. Wenn Sie jedoch Enabled = false vor ShowDialog () und Enable = true nach dem Aufruf von ShowDialog () aufrufen, sieht das Hauptformular sogar so aus, als wäre es deaktiviert.
var childForm = new Form(); Enabled = false; childForm .ShowDialog(this); Enabled = true;
quelle
ChildForm child = new ChildForm(); child.Owner = this; child.Show();
// In ChildForm_Load:
private void ChildForm_Load(object sender, EventArgs e) { this.Owner.Enabled = false; } private void ChildForm_Closed(object sender, EventArgs e) { this.Owner.Enabled = true; }
Quelle: http://social.msdn.microsoft.com/Forums/vstudio/en-US/ae8ef4ef-3ac9-43d2-b883-20abd34f0e55/how-can-i-open-a-child-window-and-block- Nur das übergeordnete Fenster
quelle
Form1 frmnew = new Form1(); frmnew.ShowDialog();
quelle
@ Melodia
Entschuldigung, dies ist kein C # -Code, aber dies ist das, was Sie möchten. Außerdem sollte die Übersetzung einfach sein.
FORM 1
Private Sub Form1_MouseEnter(sender As Object, e As EventArgs) Handles MyBase.MouseEnter Me.Focus() Me.Enabled = True Form2.Enabled = False End Sub Private Sub Form1_MouseLeave(sender As Object, e As EventArgs) Handles MyBase.MouseLeave Form2.Enabled = True Form2.Focus() End Sub
FORM2
Private Sub Form2_MouseEnter(sender As Object, e As EventArgs) Handles MyBase.MouseEnter Me.Focus() Me.Enabled = True Form1.Enabled = False End Sub Private Sub Form2_MouseLeave(sender As Object, e As EventArgs) Handles MyBase.MouseLeave Form1.Enabled = True Form1.Focus() End Sub
Hoffe das hilft
quelle
Sie können dies mit folgendem tun:
Form3 formshow = new Form3(); formshow.ShowDialog();
quelle
Sie können auch das MDIParent-Child-Formular verwenden. Legen Sie das übergeordnete Element des untergeordneten Formulars als übergeordnetes MDI fest
Z.B
In diesem Fall wird nur 1 Formular angezeigt und die untergeordneten Formulare werden in das übergeordnete Formular eingefügt. Hoffe das hilft
quelle
Für mich funktioniert diese Arbeit hier zum Beispiel, wenn das Hauptmenü deaktiviert wird, wenn Sie das Registrierungsformular öffnen.
frmUserRegistration frmMainMenu = new frmUserRegistration(); frmMainMenu.ShowDialog(this);
quelle
Wenn Sie nur versuchen, einen Form.ShowDialog-Aufruf zu simulieren, aber OHNE irgendetwas zu blockieren (ein bisschen wie ein simuliertes Dialogformular), können Sie Form.Show () verwenden. Sobald Sie das simulierte Dialogformular anzeigen, deaktivieren Sie sofort alle anderen Fenster mit etwas wie...
private void DisableAllWindows() { foreach (Form f in Application.OpenForms) if (f.Name != this.Name)f.Enabled = false; else f.Focus(); }
Wenn Sie dann Ihr "Pseudo-Dialogformular" schließen, rufen Sie unbedingt ....
private void EnableAllWindows() { foreach (Form f in Application.OpenForms) f.Enabled = true; }
quelle
Warum nicht einfach die Eltern warten lassen, bis das Kind geschlossen ist? Das ist mehr als Sie brauchen.
// Execute child process System.Diagnostics.Process proc = System.Diagnostics.Process.Start("notepad.exe"); proc.WaitForExit();
quelle