Paso 7: Repetir la interfaz de usuario
Hasta ahora hemos creado algunos campos para almacenar los datos y métodos para
inicializar la estructura de datos y obtener el texto seleccionado. Ahora debemos crear dinámicamente la interfaz de usuario para mostrar cinco juegos de la red de la plantilla.
Tenemos que guardar las cinco rejillas en una matriz de esta forma podemos acceder a la red utilizando un índice dentro de los eventos del control. Para almacenar las rejillas creadas de forma dinámica que necesitamos crear la matriz de aGroupGrids como campo privado de la clase MyControl. El tipo de datos de esta matriz es Grid (System.Windows.Controls.Grid) y número máximo de elementos es almacenado en la MAX_SLOTS constante.
privada red [] aGroupGrids = nueva rejilla [MAX_SLOTS];
Antes que inicializar el array de redes tenemos que crear un método para clonar la grdTemplate red existente que se creó en el paso 3. Desafortunadamente, .NET framework no tiene un función clonar un control de interfaz de usuario, así que tenemos que crear nuestra propia. Por lo tanto, debemos crear el método CloneControls() como se muestra a continuación.
CloneControls(Grid myGrid) red privada
{
String gridXaml = XamlWriter.Save(myGrid);
StringReader stringReader = nuevo StringReader(gridXaml);
XmlReader xmlReader = XmlReader.Create(stringReader);
Red newGrid = (Grid)XamlReader.Load(xmlReader);
volver newGrid;
}
El método CloneControls() recibe un objeto de cuadrícula como parámetro y devuelve otro objeto de cuadrícula, que es un clon del parámetro. Dentro de este método, utilizamos las clases que serializar objetos en el formato XML para obtener todas las propiedades, valores y otros elementos almacenados dentro del control. El siguiente enlace contiene una buena explicación acerca de la serialización XML con las clases XamlWriter y XMlReader en el .NET Framework 4.0.
http://blogs.msdn.com/b/bursteg/Archive/2009/05/18/XAML-in-net-4-0-Serialization-and-deserialization-Using-XamlServices.aspx
Ahora que tenemos la matriz de aGroupGrids para almacenar los controles creados dinámicos y el método CloneControls() para clonar los objetos de red que tenemos que inicializar los elementos, es decir, crearlas. Lo haremos dentro de un nuevo método llamado InitializeInteface(). Este método debería llamarse dentro de constructor de MyControl justo después de la llamada InitializeClipboard(). El constructor de la clase MyControl debería parecerse a esto:
MyControl() pública
{
InitializeComponent();
Añadir las ranuras vacías
IntilializeClipBoard();
Initilizae la interfaz
InitializeInterface();
}
Dentro de la InitializeInterface() que debemos hacer las siguientes tareas:
· Ocultar grdTemplateGrid;
· Para cada nuevo clon de la ranura para la red grdTemplateGrid:
o introduzca la nueva cuadrícula de clonado en la matriz aGroupGrid.
o establece la visibilidad de la nueva cuadrícula de clonado.
o establece la posición de la tabla clonada en un nuevo margen para que las rejillas no se superponen visualmente.
o cambiar el caption de la etiqueta para mostrar qué cuadrícula corresponden a cada ranura.
o establezca la propiedad etiqueta de los controles y el ListView para almacenar el índice de la rejilla clonado.
o establezca al delegado de métodos en los eventos click de los botones. Asimismo, establece el método de delegado al evento doble click del ListView.
o añadir la nueva red clonada para el contenedor rejilla grdMain.
A continuación se muestra el código completo del método InitializeInterface():
privado InitializeInterface() vacío
{
Left_initial doble = -170;
this.grdTemplate.Visibility = Visibility.Hidden;
para (int i = 0; i < MAX_SLOTS; i ++)
{
aGroupGrids [i] = CloneControls(this.grdTemplate);
aGroupGrids [i]. Visibilidad = Visibility.Visible;
left_initial = left_initial + 180.0;
aGroupGrids [i]. Margen = new System.Windows.Thickness (left_initial,-5.0, 0.0, 0.0);
Necesario cambiar la etiqueta de ranura + añadir los eventos a los botones y la lista
Orden de elementos
0 -> botón pegar
1 -> botón copiar
2 -> ListView
3 -> etiqueta
4 -> botón cortar
aGroupGrids [i]. Etiqueta = i;
Establece el título de la etiqueta
(AGroupGrids (etiqueta) [i]. Children[3]). Content = "Slot" + (i + 1). ToString();
Establecer las propiedades de etiquetas con el índice de esta cuadrícula de la matriz
Esto va a ser útil este último en (para eventos)
Botón pegar = (aGroupGrids (botón) [i]. Children[0]);
Botón copia = (aGroupGrids (botón) [i]. Children[1]);
Botón de corte = (aGroupGrids (botón) [i]. Children[4]);
ListView lstData = (aGroupGrids (ListView) [i]. Children[2]);
Paste.Tag = i;
Copy.Tag = i;
Cut.Tag = i;
lstData.Tag = i;
Establecer los eventos de botones (clic)
Copy.Click += Copy_Click;
Paste.Click += Paste_Click;
Cut.Click += Cut_Click;
Establecer el evento ListView (MouseDoubleClick)
lstData.MouseDoubleClick += lstData_MouseDoubleClick;
Agregar esta red principal red
grdMain.Children.Add(aGroupGrids[i]);
}
}
Cómo todo lo que tenemos que hacer es rellenar los métodos de delegado para los botones (Copy_Click, Pastle_Click, Cut_Click) y el método para el doble clic en el control ListView (lstData_MouseDoubleClick), que mostrará un simple MessageBox con el contenido del elemento seleccionado.