Window propietari Form, Form propietari Window

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();

Anuncis

cscript error: can’t find script engine for script .js

En un dels meus projectes, que aviat us parlaré, es crea un msi amb la particularitat de que s’afegeix un check box a la última pantalla de l’instal·lable per poder demanar a l’usuari si es vol o no executar l’aplicació que s’acaba d’instal·lar. La manera per fer-ho es troba en aquest link i funciona molt bé: Run exe after msi installation

Fins ara no tenia cap problema, porto ja publicades unes quantes versions i sempre s’ha construït i modificat l’msi sense problemes. Fins avui, el meu msi no es podia crear perquè el Visual Studio em donava el següent error:

‘PostBuildEvent’ failed with error code ‘1’ ‘Unspecified error’

A la pantalla output es veu:

cscript error: can’t find script engine for script .js

La única cosa que ha canviat ha sigut la instal·lació del Visual Studio 2010 SP1. Pensant què podia ser i buscant per internet alguna solució al final he donat amb la resposta.

Tal i com ens parla el link que us he deixat per aconseguir el checkbox cal des del Setup Project assignar a la propietat post-build event a

cscript.exe “$(ProjectDir)ModifyMsiToEnableLaunchApplication.js” “$(BuiltOuputPath)”

Doncs ara perquè funcioni correctament és

cscript.exe //E:jscript “$(ProjectDir)ModifyMsiToEnableLaunchApplication.js” “$(BuiltOuputPath)”