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.

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
inac ak chces mat viac rovnocennych okien pod jednym hlavnym oknom tak to sa u MS vola MDI (Multiple… nový
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… nový
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… nový
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… nový
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ž… nový
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