Stap 7: Repliceren de UI
Tot nu toe gemaakt wij sommige velden om de gegevens te bewaren en enkele methoden om te
initialiseren van de gegevensstructuur en krijgen de geselecteerde tekst. Nu moeten we de gebruikersinterface om aan te tonen van vijf sets van het sjabloon raster dynamisch maken.
We moeten de vijf rasters op een array opslaan zodat we toegang heeft tot het raster met behulp van een index binnen van het besturingselement gebeurtenissen. Voor het opslaan van de dynamisch gemaakte rasters die we moeten maken van de aGroupGrids matrix als privé gebied van de MijnBesturingselement klasse. Het gegevenstype van deze matrix is raster (System.Windows.Controls.Grid) en maximum aantal elementen is opgeslagen op de constante MAX_SLOTS.
privé raster [] aGroupGrids = nieuwe Grid [MAX_SLOTS];
Voordat we de array van rasters initialiseren die we moeten maken van een methode om te clonen van de bestaande grid grdTemplate die we op stap 3 hebt gemaakt. Helaas, het .NET framework beschikt niet over een ingebouwde functie om een kloon van een UI-besturingselement, dus we moeten creëren onze eigen. Daarom moeten we de methode van de CloneControls() zoals blijkt uit balg maken.
privé raster CloneControls(Grid myGrid)
{
gridXaml koord = XamlWriter.Save(myGrid);
StringReader stringReader = nieuwe StringReader(gridXaml);
XmlReader (Engels) XmlReader (Engels) = XmlReader.Create(stringReader);
Raster newGrid = (Grid)XamlReader.Load(xmlReader);
Return newGrid;
}
De CloneControls()-methode ontvangen een Grid-object als parameter en retourneert een ander raster object, dat een kloon van de parameter is. Binnen deze methode gebruiken we de klassen die serialize objecten op de XML-indeling om alle eigenschappen, waarden en andere elementen die in het besturingselement zijn opgeslagen. De volgende link bevat een goede uitleg over XML-serialisatie met de klassen van het XamlWriter en XmlReader (Engels) in .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
Nu dat we de aGroupGrids array om de dynamische gecreëerd controles en de CloneControls()-methode hebben om een kloon van de objecten van de grid we moeten voor het initialiseren van de elementen te slaan, dat wil zeggen ze te maken. Wij zullen dat doen binnen een nieuwe methode genaamd InitializeInteface(). Deze methode moet worden aangeroepen binnen de constructor van de MijnBesturingselement net na de oproep van de InitializeClipboard(). De constructor van de klasse MijnBesturingselement moet er zo uitzien:
openbare MyControl()
{
InitializeComponent();
Toevoegen van de lege slots
IntilializeClipBoard();
Initilizae de interface
InitializeInterface();
}
Binnen de InitializeInterface() moeten we de volgende taken:
· Verbergen van de grdTemplateGrid;
· Voor elke nieuwe sleuf kloon het grdTemplateGrid raster:
o invoegen het nieuwe gekloonde raster op de aGroupGrid array.
o instellen de zichtbaarheid voor het nieuwe gekloonde raster.
o Stel de positie van de gekloonde raster aan een nieuwe marge zodat de rasters niet visueel overlappen.
o wijziging het bijschrift van het label welke raster tonen komen overeen met elke sleuf.
o instellen de Tag-eigenschap van de controles en de ListView voor het opslaan van de index van de gekloonde raster.
o stelt de gemachtigde methoden op de gebeurtenis klikken van de knoppen. Stel ook de methode van de gemachtigde aan de tweemaal klikken-gebeurtenis van de ListView.
o het nieuwe gekloonde raster aan de container raster grdMain toevoegen.
De volledige code voor de methode InitializeInterface() wordt hieronder weergegeven:
private void InitializeInterface()
{
Dubbele left_initial =-170;
this.grdTemplate.Visibility = Visibility.Hidden;
for (int i = 0; ik < MAX_SLOTS; i ++)
{
aGroupGrids [i] = CloneControls(this.grdTemplate);
aGroupGrids [i]. Zichtbaarheid = Visibility.Visible;
left_initial = left_initial + 180,0;
aGroupGrids [i]. Marge = nieuwe System.Windows.Thickness (left_initial,-5.0, 0.0, 0.0);
Wilt wijzigen van het label Slot + de gebeurtenissen aan de knoppen en de lijst toevoegen
Volgorde van elementen
0 -> knop plakken
1 -> knop kopiëren
2 -> ListView
3 -> etiketten
4 -> knop Knippen
aGroupGrids [i]. Label = i;
Instellen van de Label bijschrift
((Label) aGroupGrids [i]. Children[3]). Inhoud = "Slot" + (i + 1). ToString();
Stel de eigenschappen van de Tags met de index van het raster in de matrix
Dit gaat nuttig zijn laatste op (van de gebeurtenissen)
Knop plakken = ((knop) aGroupGrids [i]. Children[0]);
Knop kopie = ((knop) aGroupGrids [i]. Children[1]);
Knop Knippen = ((knop) aGroupGrids [i]. Children[4]);
ListView lstData = ((ListView) aGroupGrids [i]. Children[2]);
Paste.Tag = i;
Copy.Tag = i;
Cut.Tag = i;
lstData.Tag = i;
Instellen van de knoppen gebeurtenissen (klik)
Copy.Click += Copy_Click;
Paste.Click += Paste_Click;
Cut.Click += Cut_Click;
Stel de ListView-gebeurtenis (MouseDoubleClick)
lstData.MouseDoubleClick += lstData_MouseDoubleClick;
Dit raster toevoegen aan de bovenliggende raster
grdMain.Children.Add(aGroupGrids[i]);
}
}
Hoe alles wat we moeten doen is Vul de gemachtigde methoden voor de knoppen (Copy_Click, Pastle_Click, Cut_Click) en de methode voor de dubbele klik op de ListView (lstData_MouseDoubleClick), die zal laten zien een eenvoudige MessageBox met de inhoud van het geselecteerde item.