WPF v aplikaci - lze zobrazit pouze jednou   zodpovězená otázka

WPF

Zdravím,

mám problém s doplňkem v aplikaci, kde používám WPF okna. Pro zobrazení okna používám metodu ShowDialog(). Okno se v aplikaci normálně zobrazí, ale pouze jednou, pak vyskočí chyba:

"System.InvalidOperationException: Cannot set Visibility or call Show, ShowDialog, or WindowInteropHelper.EnsureHandle ..."

Našel jsem pomoci Googlu, že to není až tak neobvyklé, ale bohužel nejsem příliš zdatný angličtinář, ani programátor, tak mi to moc nepomohlo.

Nemohl by mi tu prosím někdo poradit, jak z toho ven?

Děkuji!

nahlásit spamnahlásit spam 0 odpovědětodpovědět

K tomu dochází při opakovaném otevírání jedné instance okna?

Taky jsem to našel a řešením nejspíš je, že pokud vytvoříte novou instanci a po volání ShowDialog se zobrazí jako obvykle, tak zkuste pracovat pokaždé s novou instancí okna, trváte-li na jedné instanci, pak zkuste v události Closing okno místo zavření jenom skrýt (potom vlastně původní instanci opět zobrazit) :

Private Sub Window_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles Me.Closing
        e.Cancel = True
        Me.Visibility = Windows.Visibility.Hidden 'Me.Hide()
End Sub

Add By Google

Best Solution for Error Cannot set Visibility or call Show or ShowDialog after window has closed :

https://ramsgotrus.wordpress.com/2009/03...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

K tomu dochází při opakovaném otevírání jedné instance okna?

Taky jsem to našel a řešením nejspíš je, že pokud vytvoříte novou instanci a po volání ShowDialog se zobrazí jako obvykle, tak zkuste pracovat pokaždé s novou instancí okna, trváte-li na jedné instanci, pak zkuste v události Closing okno místo zavření jenom skrýt (potom vlastně původní instanci opět zobrazit) :

Private Sub Window_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles Me.Closing
        e.Cancel = True
        Me.Visibility = Windows.Visibility.Hidden 'Me.Hide()
End Sub

Add By Google

Best Solution for Error Cannot set Visibility or call Show or ShowDialog after window has closed :

https://ramsgotrus.wordpress.com/2009/03...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ještě jsem zahlídnul řešení, že si pro zobrazování vytvoříte vlastní třídu a v konstruktoru vždy vytvoříte novou instanci okna.

Omlouvám se za duplicitní vložení předchozího příspěvku, zkusím to znovu, snad už pouze jednou.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Použít pokaždé novou instanci mě taky napadlo. Zkusím to použít.

Vytváření vlastní třídy na zobrazení okna je nad moje síly :-D

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Když vytvářím pokaždé novou instanci, tak není problém.

Děkuji za pomoc!

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zavoláním Close() na instanci, windows odstraní všechny zdroje dané instance a není tudíž možné znovu volat Show/ShowDialog.

V téhle době je rychlost PC a velikost pamětí dostatečná, aby se takové věci nemuseli řešit. Ano měl jsem případ na windows ce s 128MB Ram kde vytváření instance okna trvalo strašnou dobu a tam se hodilo okno volat jako show a schovávat ho. Ale to byl za 10 let jeden případ ve winforms. WPF určitě pouštíte na nějakém normálním PC.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zavoláním Close() na instanci, windows odstraní všechny zdroje dané instance a není tudíž možné znovu volat Show/ShowDialog.

V téhle době je rychlost PC a velikost pamětí dostatečná, aby se takové věci nemuseli řešit. Ano měl jsem případ na windows ce s 128MB Ram kde vytváření instance okna trvalo strašnou dobu a tam se hodilo okno volat jako show a schovávat ho. Ale to byl za 10 let jeden případ ve winforms. WPF určitě pouštíte na nějakém normálním PC.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ano, aplikace je spouštěna na PC s dostatečným výkonem. Takže vytvářet okno pokaždé znovu není žádný problém (naštěstí).

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ovšem pokud se instance těch oken nezavírá, resp. neukončuje sama, je někde něco špatně... Mohlo by se stát (pokud program pojede déle), že otevíráním dalších instancí sežere všechny prostředky a ...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jestli jsem "můj" problém pochopil správně, tak chyba spočívala v tom, že se okno ukončilo, zahodily se zdroje a při pokusu o zobrazení ta instance nebyla k dispozici.

Takže ukončení proběhlo správně, chyba byla ve volání již neexistujícího objektu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Je to tak. Lze pouze z uzavřené instance číst nějaké vlastnosti.

var dlg = new NejakyWindow();   //vytvoření instance

if (dlg.ShowDialog() == true)   //V dialogu(window) nastavíte DialogResult a zavoláte Close()
{
   vysledek = dlg.TextovyVstup;   //uložení výsledků z dialogu 
}

//tady už nelze znovu volat ShowDialog resp. Show
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Přesně tak to používám a mám udělané.

Předtím jsem instanci vytvářel při inicializaci aplikace a to bylo špatně.

Děkuji za upřesnění :-)

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback