windows - midlertidigt skjul en modal dialog

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en modal dialog, der vises med hovedprogramvinduet som ejer (som i dialog.ShowDialog(mainAppWindow)), og jeg vil gerne midlertidigt tillade brugeren at interagere med hovedprogramvinduet, før han vender tilbage til den modale dialog igen.


Hvordan kan jeg gøre dette? Jeg bruger Windows Forms.


 AutoCAD gør det godt.

Bedste reference


Bare luk den modale dialog. Det bliver ikke kasseret som normale forminstanser gør det, du bare bringer det tilbage ved at ringe til ShowDialog () igen. Bemærk at kald Hide () på en modal dialog lukker også den.

Andre referencer 1


Så tror jeg ikke, at du vil have en modal dialog ...


Hele formålet med en modal dialog er, at brugeren ikke kan noget , indtil de er blevet fjernet af den på en eller anden måde. Jeg tror, ​​at du bare skal oprette din egen formularklasse for at handle som du vil.

Andre referencer 2


Tag et kig på http://en.wikipedia.org/wiki/Modal\_window#Criticisms ... Der er en tankegang, som du ikke bør bruge modale vinduer i første omgang. [3]

Andre referencer 3


Du skal aktivere overordnede vindue igen. For modale dialoger deaktiverer Windows automatisk forældrelsesvinduet og genaktiverer det, hvis den modale dialog blev lukket.


Jeg har ikke prøvet det, men det bør være tilstrækkeligt til at indstille den aktiverede egenskab af din overordnede formular til sand. Hvis det ikke virker ved hjælp af EnableWindow Win32 API, virker det.

Andre referencer 4


Af en eller anden grund er jeg nødt til at møde det samme problem i .NET.
Jeg har (hoved) formularen der viser modal dialog, som jeg skal skjule, interagere med hovedvinduet og vende tilbage til den modale dialog igen.


Jeg forstår ikke personligt konsekvenser fra Windows (API) synspunkt, men følgende løsning virker for mig.


Hele tricket ligger i at indstille hovedformularen til deaktiveret, før der vises modal dialog (når hovedformularen ikke er indstillet til Aktiveret=Falsk eksplicit, så kan man ikke gemme interaktion med det, selvom Enabled=True hedder).


Som svar på modal dialoghændelse (kaldet NeedInteraction) skjuler jeg bare modal dialog, aktiver hovedform, i nogle loop gør interaktion med bruger, deaktiver hoveddialog og vis modal dialog igen.


void ShowDialog()
{
  var dialog = new MyModalForm();
  dialog.NeedInteraction += (sender, eventArgs) =>
  {
    dialog.Hide();
    Enabled = true;

    //wait till user finishes working with main window

    Enabled = false;
    dialog.Show();
  }

  Enabled = false;
  dialog.ShowDialog();
  Enabled = true; //don't forget to make it enabled afterwards
}


Det kan ikke være ren løsning (det er ikke nødvendigt at gemme modal dialog), men det virker i det mindste for min situation.

Andre referencer 5


Det modale/modløse paradigme er, at hvis du vil have brugeren mulighed for at kunne interagere med hovedapplikationen, skal du bruge et modelt vindue, og hvis du ikke bruger en modal. Hvis du vil stoppe ham ved at bruge hovedapplikationen - men så brug det - men brug det ikke - dit brugergrænseflade design virker ikke med det modale/modløse paradigme.