MultiSlot Urklipp (7 / 9 steg)
Steg 7: Replikera UI
Så långt skapat vi vissa fält för att lagra data och några metoder för att
initiera datastrukturen och få den markerade texten. Nu måste vi skapa dynamiskt användargränssnitt för att Visa fem uppsättningar av rutnätet mall.
Vi behöver lagra fem gallren på en matris så vi kan komma åt nätet med hjälp av ett index innanför kontrollens händelser. Att lagra dynamiskt skapade rutnäten måste vi skapa matrisen aGroupGrids som privat fält i klassen MinKontroll. Datatypen i denna matris är Grid (System.Windows.Controls.Grid) och högsta antalet element är lagrad på den konstant MAX_SLOTS.
privata nät [] aGroupGrids = nya nätet [MAX_SLOTS];
Innan vi initiera matrisen av nät vi måste skapa en metod för att klona den befintliga grid grdTemplate vi skapat på steg 3. Tyvärr, .NET framework har inte en inbyggd funktion att klona en UI kontroll, så vi måste skapa våra egna. Därför måste vi skapa metoden CloneControls() som visar nedan.
privat Grid CloneControls(Grid myGrid)
{
string gridXaml = XamlWriter.Save(myGrid);
StringReader stringReader = ny StringReader(gridXaml);
XmlReader xmlReader = XmlReader.Create(stringReader);
Grid newGrid = (Grid)XamlReader.Load(xmlReader);
återvända newGrid;
}
CloneControls() metoden få en Grid-objektet som en parameter och returnerar ett annat rutnät objekt, som är en klon av parametern. Inuti denna metod använder vi de klasser som serialisera objekt på formatet XML att få alla egenskaper, värderingar och andra element som lagras i kontrollen. Följande länk innehåller en bra förklaring om XML serialization med klasserna XamlWriter och XMlReader på .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 när vi har aGroupGrids matrisen att lagra de dynamiska skapade kontrollerna och den CloneControls() metoden att klona rutnät objekten vi måste initiera elementen, dvs skapa dem. Vi kommer att göra det inne i en ny metod som kallas InitializeInteface(). Denna metod ska anropas inuti den MinKontroll konstruktören strax efter anropet InitializeClipboard(). Konstruktören av klassen MinKontroll bör se ut så här:
offentliga MyControl()
{
InitializeComponent();
Lägga till tomma platser
IntilializeClipBoard();
Initilizae gränssnittet
InitializeInterface();
}
Inuti InitializeInterface() ska vi göra följande uppgifter:
· Dölja grdTemplateGrid;
· För varje ny slot klon grdTemplateGrid nätet:
o sätt in nya klonade rutnätet på aGroupGrid matrisen.
o ange synligheten för nya klonade rutnätet.
o ange position av klonade nätet en ny marginal så rutnäten inte överlappar visuellt.
o ändra bildtexten etikettens Visa som rutnät motsvarar varje kortplats.
o egenskapen Tag av kontrollerna och ListView att lagra index för klonade rutnätet.
o ställa ombudet metoder till Klicka på händelserna i knapparna. Ange även delegatmetod dubbelklicka på händelsen i ListView.
o Lägg till nya klonade rutnätet i behållaren grid grdMain.
Den fullständiga koden för metoden InitializeInterface() visas nedan:
privata void InitializeInterface()
{
Double left_initial =-170;
this.grdTemplate.Visibility = Visibility.Hidden;
för (int jag = 0; jag < MAX_SLOTS; i ++)
{
aGroupGrids [i] = CloneControls(this.grdTemplate);
aGroupGrids [i]. Synlighet = Visibility.Visible;
left_initial = left_initial + 180,0;
aGroupGrids [i]. Marginal = ny System.Windows.Thickness (left_initial,-5.0, 0,0, 0,0);
Måste ändra Slot etikett + lägga till händelser i knapparna och listan
Beställning av delar
0 -> knappen Klistra in
1 -> knappen Kopiera
2 -> listvy
3 -> etikett
4 -> knappen Cut
aGroupGrids [i]. Tag = i.
Ange etiketten bildtexten
((Etikett) aGroupGrids [i]. Children[3]). Content = "Slot" (jag + 1). ToString();
Ställer in Taggar med index för rutnätet i matrisen
Detta kommer att vara användbart senare på (för händelser)
Knappen Klistra in = ((knappen) aGroupGrids [i]. Children[0]);
Knappen Kopiera = ((knappen) aGroupGrids [i]. Children[1]);
Knappen Cut = ((knappen) aGroupGrids [i]. Children[4]);
ListView lstData = ((listvy) aGroupGrids [i]. Children[2]);
Paste.Tag = i.
Copy.Tag = i.
Cut.Tag = i.
lstData.Tag = i.
Ställa in knapparna händelserna (klicka)
Copy.Click += Copy_Click;
Paste.Click += Paste_Click;
Cut.Click += Cut_Click;
Ställa in händelsen ListView (MouseDoubleClick)
lstData.MouseDoubleClick += lstData_MouseDoubleClick;
Lägga till rutnätet i överordnat rutnät
grdMain.Children.Add(aGroupGrids[i]);
}
}
Hur allt vi behöver göra är att fylla i metoderna som delegat för knapparna (Copy_Click, Pastle_Click, Cut_Click) och metoden för dubbel klicka på ListView (lstData_MouseDoubleClick), som visar en enkel meddelanderuta med innehållet i det markerade objektet.