Quan es treballa amb WPF es poden utilitzar les antigues WinForms sense cap problema. Però com ho podem fer per assignar com a propietari d’una finestra window un winform i viceversa? El concepte és utilitzat sense problemes entre objectes de la mateixa classe i assignar propietaris ens és útil per assegurar-nos de que la finestra es tancarà en el moment que es tanqui la principal, és a dir, la responsable de haver obert l’altre.
Detallo a continuació com fer per cada un dels casos.
Un WinForm obre un Window
És dels dos el més senzill. Es tracta d’utilitzar el WindowInteropHelper que es troba dins l’espai de noms System.Window.Interop. Creem una instància de la classe passant per paràmetre la instància de la Window que volem obrir.
Window1 w = new Window1();
System.Windows.Interop.WindowInteropHelper ih=new System.Windows.Interop.WindowInteropHelper(w);
La propietat Owner de la instància WindowInteropHelper i assignem la propietat Handle del WinForms
ih.Owner = Handle;
A partir d’aquest moment ja podem obrir la window
w.Show();
Un Window obre un WinForm
Per mi és el que menys m’agrada però és efectiu i sembla que la única manera de poder-ho fer.
Necessitem utilitzar un mètode de la llibreria User32.dll directament.
[DllImport("user32.dll")]
private static extern int SetWindowLong(HandleRef hWnd, int nIndex, int dwNewLong);
Després podem obrir el WinForm
Form1 f = new Form1();
WindowInteropHelper helper = new WindowInteropHelper(this);
SetWindowLong(new HandleRef(f, f.Handle), -8, helper.Handle.ToInt32());
f.Show();