PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : WPF Form lässt sich nicht 2x als Dialog aufrufen


minos5000
2014-04-17, 14:22:56
Hi,

ich stolpere gerade über ein eigenartiges Verhalten einer Form. Wenn ich diese per


formPreferences.ShowDialog();


aufrufe, geht das exakt 1x. Beim 2. Aufruf erhalte ich immer eine InvalidOperation Exception. Google hat mir gesagt, dass ich nicht der einzige mit diesem Problem zu sein scheine, aber eine Erklärung für das Verhalten habe ich dennoch nicht gefunden.

Derzeit behelfe ich mir dadurch, dass ich schlicht vor jedem Öffnen die Form neu erzeuge und befülle, aber gibt es nicht auch einen Weg, die gleiche Form mehrmals zu verwenden?

PatkIllA
2014-04-17, 15:10:32
WPF oder Forms? In WPF wäre es ein Window.

Die in der MSDN angebenen Gründe kannst du ausschließen?
Und was ist in dem Window?

Da WPF sowieso alle nase lang neue Elemente erzeugt würde ich mir da auch nicht soviel sorgen machen.

minos5000
2014-04-17, 15:47:35
Oh ja, entschuldige die Doppeldeutigkeit. Gemeint ist WPF, aus Gewohnheit nenne ich die Windows darin dummerweise immer noch Forms...

Im Prinzip geht es mir um diesen Satz in dem MSDN:


InvalidOperationException: ShowDialog is called on a window that is closing (Closing) or has been closed (Closed).

Ich würde gerne verstehen, warum es nicht möglich ist/sein soll einen einmal geschlossenen Dialog erneut anzuzeigen.

Oder war das schlicht eine Designentscheidung der Entwickler und ich muss mich mit einem "weil halt" zufrieden geben ;)

PatkIllA
2014-04-17, 16:22:53
Zumindest bekommt man ein Closed Event, when man den Dialog schließt. Wahrscheinlich werden da auch gleich die Resources weggeräumt. Ein normal angezeigtes Window kann man nach dem Schhließen auch nicht wieder anzeigen. Da müsste man es unsichtbar schalten.
WpfApplication2.exe!WpfApplication2.MainWindow._Dialog_Closed(object sender, System.EventArgs e) Line 43
PresentationFramework.dll!System.Windows.Window.OnClosed(System.EventArgs e)
PresentationFramework.dll!System.Windows.Window.WmDestroy()
PresentationFramework.dll!System.Windows.Window.WindowFilterMessage(System.IntPt r hwnd, int msg, System.IntPtr wParam, System.IntPtr lParam, ref bool handled)
PresentationCore.dll!System.Windows.Interop.HwndSource.PublicHooksFilterMessage( System.IntPtr hwnd, int msg, System.IntPtr wParam, System.IntPtr lParam, ref bool handled)
WindowsBase.dll!MS.Win32.HwndWrapper.WndProc(System.IntPtr hwnd, int msg, System.IntPtr wParam, System.IntPtr lParam, ref bool handled)
WindowsBase.dll!MS.Win32.HwndSubclass.DispatcherCallbackOperation(object o)
WindowsBase.dll!System.Windows.Threading.ExceptionWrapper.InternalRealCall(Syste m.Delegate callback, object args, int numArgs)
WindowsBase.dll!MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(object source, System.Delegate method, object args, int numArgs, System.Delegate catchHandler)
WindowsBase.dll!System.Windows.Threading.Dispatcher.LegacyInvokeImpl(System.Wind ows.Threading.DispatcherPriority priority, System.TimeSpan timeout, System.Delegate method, object args, int numArgs)
WindowsBase.dll!MS.Win32.HwndSubclass.SubclassWndProc(System.IntPtr hwnd, int msg, System.IntPtr wParam, System.IntPtr lParam)
[Native to Managed Transition]
[Managed to Native Transition]
WindowsBase.dll!MS.Win32.HwndSubclass.DefWndProcWrapper(System.IntPtr hwnd, int msg, System.IntPtr wParam, System.IntPtr lParam)
[Native to Managed Transition]
[Managed to Native Transition]
WindowsBase.dll!MS.Win32.HwndSubclass.SubclassWndProc(System.IntPtr hwnd, int msg, System.IntPtr wParam, System.IntPtr lParam)
[Native to Managed Transition]
[Managed to Native Transition]
WindowsBase.dll!MS.Win32.HwndSubclass.DefWndProcWrapper(System.IntPtr hwnd, int msg, System.IntPtr wParam, System.IntPtr lParam)
[Native to Managed Transition]
[Managed to Native Transition]
WindowsBase.dll!MS.Win32.HwndSubclass.SubclassWndProc(System.IntPtr hwnd, int msg, System.IntPtr wParam, System.IntPtr lParam)
[Native to Managed Transition]
[Managed to Native Transition]
WindowsBase.dll!MS.Win32.HwndSubclass.DefWndProcWrapper(System.IntPtr hwnd, int msg, System.IntPtr wParam, System.IntPtr lParam)
[Native to Managed Transition]
[Managed to Native Transition]
WindowsBase.dll!MS.Win32.HwndSubclass.SubclassWndProc(System.IntPtr hwnd, int msg, System.IntPtr wParam, System.IntPtr lParam)
[Native to Managed Transition]
[Managed to Native Transition]
WindowsBase.dll!System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows .Threading.DispatcherFrame frame)
WindowsBase.dll!System.Windows.Threading.Dispatcher.PushFrame(System.Windows.Thr eading.DispatcherFrame frame)
PresentationFramework.dll!System.Windows.Window.ShowHelper(object booleanBox)
PresentationFramework.dll!System.Windows.Window.Show()
PresentationFramework.dll!System.Windows.Window.ShowDialog()

Marscel
2014-04-17, 18:59:57
Ließ MSDN, da steht, was bei einem Close alles passiert. Also entweder Hide() oder neu instanziieren.