Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno C# nezavírat potomky okna při zavření rodiče

Ahoj,

potřebovala bych poradit - mám Form a po stisknutí tlačítka se zobrazí další instance toho Formu.

private void New()
{
 Form1 f = new Form1();
 f.Show();
}

Funguje to, ale když zavřu první okno, zavřou se i všechny ostatní. Potřebovala bych, aby všechna okna byla na stejné úrovni. Děkuji za každou radu.

Předmět Autor Datum
Neviem zhlavy ale ide o to zmenit ownera. Skus z hlavneho formu zavolat toto http://msdn.microsoft.c…
MM.. 03.08.2011 02:56
MM..
inac ak chces mat viac rovnocennych okien pod jednym hlavnym oknom tak to sa u MS vola MDI (Multiple…
MM.. 03.08.2011 03:04
MM..
Omlouvám se, ten nadpis je asi trochu zavádějící. Řekněme, že spustím aplikaci, otevře se Okno1. Z n…
flemch 03.08.2011 13:23
flemch
Nóo. Poradím ti fintu. Ale než ti ji ukáži, :-D nastíním ještě jednu cestu. Můžeš zobrazovat tzv. m…
Flash_Gordon 03.08.2011 14:08
Flash_Gordon
Více možností: 1) Hlavní okno otevřete jako skryté(prázdné), viditelná nechte jen podkokna. 2)Použij…
Daveran 03.08.2011 14:09
Daveran
Mockrát děkuju, funguje to :-) Jen nechápu poznámku, že bych měla při zavírání "měnit rodiče", když…
flemch 03.08.2011 20:46
flemch
Takéto správanie sa klasicky robí pomocou vlastného ApplicationContextu. Spravíš si vlastný kontext… poslední
los 03.08.2011 22:42
los

Omlouvám se, ten nadpis je asi trochu zavádějící.
Řekněme, že spustím aplikaci, otevře se Okno1. Z něho otevřu Okno2 a z Okna2 otevřu Okno3. Všechny vypadají úplně stejně tzn. měly by se stejně i chovat. Když zavřu Okno2, Okno3 se NEzavře, takže vlastně nejde o rodiče a potomky. Ale když zavřu Okno1, ukončí se aplikace a tím pádem se zavřou i všechny ostatní okna.
Já bych potřebovala, aby se aplikace ukončila, až když se zavře poslední otevřené okno, ať už bylo otevřené jako první nebo poslední. Prostě aby z tohoto pohledu byly na stejné úrovni. Ale vůbec nevím, jak toho docílit. Zkoušela jsem hledat, v cestine i anglictine, ale nenasla jsem :-(

Děkuju za odkazy, ale na tohle mi asi nepomůžou, že?

Nóo. Poradím ti fintu.
Ale než ti ji ukáži, :-D nastíním ještě jednu cestu.

Můžeš zobrazovat tzv. modální dialog:

 Form1 f = new Form1();
 f.ShowDialog();

Naznačené volání funkce (auuuu bolí mě břicho, jsem se přejed) bude čekat až se zavře vždy poslední vytvořené okno.

Jednodušší a podmínky splňující bude, ale volat pro každé okno novou instanci programu, programy pak budou na sobě nezávislé.

Řekněme, že tvůj program se jmenuje program.exe :

using System.Threading;
using System.Diagnostics;

            try
            {

                Process p = new Process();
                p.StartInfo.FileName = "program.exe";
                              
                p.Start();
                

            }
            catch (Exception ex)
            {
                MessageBox.Show("Exception Occurred :" + ex.Message + ex.StackTrace.ToString());
            }



Vykonáním uvedeného kodu docílíš tvého (auu) chování.

Mockrát děkuju, funguje to :-)
Jen nechápu poznámku, že bych měla při zavírání "měnit rodiče", když jsou instance programu nezávislé. Nicméně to funguje i bez toho, tak snad v tom není nějaký háček...

Takéto správanie sa klasicky robí pomocou vlastného ApplicationContextu. Spravíš si vlastný kontext aplikácie, v ktorom preťažíš metódu OnMainFormClosed, aby sa pri zatvorení hlavného okna neukončila aplikácia. V obsluhe udalosti Application.Idle budeš kontrolovať počet otvorených okien v Application.OpenForms a v prípade, že klesne na nulu, ukončíš aplikáciu.

Samostatné procesy budú fungovať samozrejme tiež, ale so všetkými vlastnosťami, ktoré z toho vyplývajú, ako napr. zložitejšie riešenie komunikácie medzi formulármi, väčšie nároky na systémové prostriedky a pod.

Edit: Vo WPF sa to dá spraviť nastavením jednej vlastnosti Application.ShutdownMode.

Zpět do poradny Odpovědět na původní otázku Nahoru