A continuación procederemos a desarrollar el diseñador que permita editar la configuración especifica de la actividad en tiempo de diseño, para ello, deberemos agregar al proyecto un elemento de tipo Class, el cual en este ejemplo, llamaremos MyActivityDesigner:
Al hacer doble clic sobre dicho archivo, pasaremos a editar su contenido., el cual inicialmente será:
namespace CustomActivities
{
public class MyActivityDesigner
{
}
}
Procederemos a:
namespace Tycon.Labs.CustomActivities
{
// Indicamos que al hacer doble clic en el Designer se despliegue el UserControl que definiremos a continuacion
[Tycon.BIZUIT.Design.ActivityDesigners.ActivityDesignerControl(typeof(MyCustomEditor))]
public class MyActivityDesigner : Tycon.BIZUIT.Design.ActivityDesigners.BaseActivityDesigner
{
}
}
Además, deberemos referenciar en nuestro proyecto a la librería System.Workflow.ComponentModel, Tycon.BIZUIT.Activities.dll y Tycon.BIZUIT.CoreLibrary.dll.
A continuación, procederemos a agregar al proyecto un UserControl que presentará la interfaz de configuración al usuario. En nuestro ejemplo lo llamaremos MyCustomEditor:
Haciendo clic derecho y seleccionando View Code, procederemos a:
namespace Tycon.Labs.CustomActivities
{
public partial class MyCustomEditor : Tycon.BIZUIT.Design.ActivityDesigners.BaseWizardControl
{
public MyCustomEditor()
{
InitializeComponent();
}
private Tycon.BIZUIT.Interfaces.ITyconActivity _activity;
private string _myValue1;
private string _myValue2;
private string _outputSchema;
private bool _loaded = false;
}
}
En este punto estamos preparados para desarrollar la interfaz de usuario propiamente dicha. Para ello, haremos doble clic sobre el archivo MyCustomEditor.cs el cual nos abrirá su interfaz de edición:
Procederemos a continuación a agregar los controles definidos en el Paso 2.
Una vez terminado el diseño de la interfaz, procederemos a implementar los métodos requeridos por la clase base BaseWizardControl y a implementar la funcionalidad del botón Test:
public override void Initialize(Tycon.BIZUIT.Interfaces.ITyconActivity act)
{
// Permite obtener los datos almacenados en la actividad.
// Obtenemos los valores de las propiedades y el OutputSchema que tuviera la actividad
// y se los asignamos a las variables privadas
_activity = act;
MyActivity myAct = (MyActivity)_activity;
_myValue1 = myAct.MyValue1;
_myValue2 = myAct.MyValue2;
_outputSchema = myAct.OutputSchema;
// Setearemos la propiedad InputSchema con el esquema definido en el paso 3
InputSchema = @"<xs:schema attributeFormDefault=""unqualified"" elementFormDefault=""qualified"" xmlns:xs=""http://www.w3.org/2001/XMLSchema"">
<xs:element name=""MyActivity"">
<xs:complexType>
<xs:sequence>
<xs:element name=""MyValue1"" />
<xs:element name=""MyValue2"" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>";
//Otra forma mas sencilla de obtener el XSD de la estructura de entrada es inferirlo a partir del XML que recibirá la actividad
//Utilizando para ello la funcion InferXmlSchema presente en el SDK de BIZUIT
//string xmlToInfer = "<MyActivity><MyValue1/><MyValue2/></MyActivity>";
//InputSchema = Tycon.BIZUIT.CoreLibrary.XmlFunctions.InferXmlSchema(xmlToInfer);
}
public override bool ValidateData()
{
// Permite realizar validaciones de entrada a los controles de la interfaz, en nuestro caso al ser muy trivial no realizaremos ningun control
return true;
}
public override void LoadControl()
{
// Permite cargar en los controles de la interfaz los datos almacenados en la actividad.
base.LoadControl();
// Cuando se abre la actividad por primera vez, seteamos los valores de los controles con
// los valores almacenados en la actividad
if (_loaded == false)
{
txtValor1.Text = _myValue1;
txtValor2.Text = _myValue2;
_loaded = true;
}
}
public override void PageChanged()
{
// Se ejecuta cuando el Asistente de Configuración cambia de página.
//Si el esquema de salida ha sido seteado, no debe mostrar la pantalla en la que se le pide al usuario que lo ingrese manualmente
if (!string.IsNullOrEmpty(_outputSchema))
{
Raise_OnSkipAnotherPage(true, typeof(Tycon.BIZUIT.Design.ActivityDesigners.ucSchema));
}
}
public override void AcceptChanges()
{
// Permite almacenar en la actividad los seteos realizados. Se ejecuta cuando finaliza el Asistente de Configuración.
MyActivity activity = (MyActivity)_activity;
activity.MyValue1 = txtValor1.Text;
activity.MyValue2 = txtValor2.Text;
OutputSchema = _outputSchema;
}
private void btnTest_Click(object sender, System.EventArgs e)
{
string result;
result = txtValor1.Text + txtValor2.Text;
txtResultado.Text = result;
// Setearemos la propiedad OutputSchema con el esquema de salida definido en el paso 3
_outputSchema=@"<xs:schema attributeFormDefault=""unqualified"" elementFormDefault=""qualified"" xmlns:xs=""http://www.w3.org/2001/XMLSchema"">
<xs:element name=""Response"" type=""xs:string"" />
</xs:schema>";
//Otra forma mas sencilla de obtener el XSD de la estructura de salida es inferirlo a partir del XML que devolverá la actividad
//Utilizando para ello la funcion InferXmlSchema presente en el SDK de BIZUIT
//string xmlToInfer = "<Response>" + result + "</Response>";
//OutputSchema = Tycon.BIZUIT.CoreLibrary.XmlFunctions.InferXmlSchema(xmlToInfer);
//Disparamos evento que avisa que se ha cambiado el esquema de salida de la actividad
Raise_OnChangeSchema(Tycon.BIZUIT.EventArguments.ChangeSchemaEventArgs.ChangeSchemaType.OutputSchema, _outputSchema);
}