jump to navigation

Centrar ventanas emergentes usando CAB April 23, 2008

Posted by Manuel Trejo in .NET.
Tags: , , ,
add a comment

Existe un pequeño bug cuando se intenta centrar ventanas emergentes (modales) usando la clase WindowSmartPartInfo que nos provee el CAB. Dicho problema es que no respeta la ubicacion en pantalla que se le asigna a nuestra ventana modal al setearle la propiedad Location con los valores deseados.
Cuando uno usa a un winform en modo modal, la propiedad que determina la ubicacion en pantalla deja de ser Location, y pasa a ser FormStartPosition. El problema esta en que la clase WindowSmartPartInfo carece de dicha property y es por esto que nunca vamos a poder centrar una ventana modal utilizando CAB, salvo que modifiquemos el comportamiento de esta clase…..
Si se usa SCSF, nosotros solo referenciamos a las assemblies que genera el CAB, pero como disponemos del codigo fuente de este ultimo, solo necesitamos abrir la solucion ModuleLoader.sln, y modificar lo que sea necesario
Entonces, una vez abierto el proyecto, primero necesitamos agregar la propiedad FormStartPosition a la clase WindowSmartPartInfo. Entonces:
- agregamos la referencia a System.Windows.Forms
- agregamos el siguiente codigo:

private FormStartPosition startPosition = default(FormStartPosition);

///
/// Start position of the Modal form
///
DefaultValue(false)
Category(“Layout”)
public FormStartPosition StartPosition
{
get { return startPosition; }
set { startPosition = value; }
}

Ahora, tenemos que hacerle saber al workspace que va a contener a la ventana modal, cual es la posicion inicial sobre la cual se va a mostrar esta.

Para esto, le agregamos el siguiente codigo al metodo SetWindowProperties de a clase WindowWorkspace.

form.StartPosition = info.StartPosition;

Ahora, solo nos falta generar de nuevo la assembly y reemplazar la que existente en nuestro proyecto.
A partir de ahora cuando necesitemos mostrar una ventana modal centrada usando CAB o SCSF, necesitaremos setear la nueva property, por ejemplo:

WindowWorkspace workspace = new WindowWorkspace();
WindowSmartPartInfo info = new WindowSmartPartInfo();
info.Modal = true;
info.StartPosition = FormStartPosition.CenterParent;
MyDialog dialog = WorkItem.Items.AddNew();
workspace.Show(dialog, info);

Pero que linda ventanita centrada tenemos ahora!