MultiSlot Urklipp (8 / 9 steg)
Steg 8: Kodning händelserna
I detta steg måste vi fylla i koden för händelserna av knapparna
och ListView. Dessa händelser är generiska, vilket innebär att alla dynamiskt genererade kontroller kommer att kalla dessa händelser. Så, för att veta vilken slot kallas evenemanget vi läser egenskapen Tag av kontroll, som innehåller korrekt index för array-aClipboardSlotData.
Låt oss börja med den händelse som hanterar dubbel klick på ListView. När användaren dubbelklickar på en ListViewItem bör vi Visa en meddelanderuta med innehåll av de valda elementen.
Om SelectedIndex för egenskapen ListView är större än -1 Detta innebär att en artikel valdes ut och vi kommer att använda värdet för den här egenskapen som ett index för matrisen som lagrar urklippsdata (aClipboardSlotData). Följande kod visar innehållet i lstData_MouseDoubleClick() delegatmetod.
void lstData_MouseDoubleClick (objekt avsändare, MouseButtonEventArgs e)
{
ListView v = (listvy) avsändaren.
heltal index = Convert.ToInt32(v.Tag);
om (v.SelectedIndex! = -1)
MessageBox.Show (aClipboadSlotData [index]. ElementAt(v.SelectedIndex). ToString());
}
Den nästa delegatmetod måste vi skapa är den händelse som hanterar den klickar du på knappen Kopiera. Denna delegatmetod kallas Copy_Click() och vi måste först få aktiv kod-fönstret med GetActiveView()-metoden skapas på steg 6 och kontrollera om vyn är rätta.
Därefter måste vi läsa den aktuella markerade texten med metoden GetTextForPastie() som skapades också på steg 6. När vi får texten måste vi kontrollera om den är tom.
Om den markerade texten inte är tom, måste vi infoga det på array aClipboardSlotData. Vi utför denna kortisättning i en ny metod som kallas InsertDataHistory(). Slutligen måste vi uppdatera ListView med en annan ny metod som kallas AccomodateDataListView(). Men först ska vi se koden för Copy_Click() delegera metod.
void Copy_Click (objekt avsändare, RoutedEventArgs e)
{
heltal index = Convert.ToInt32(((Button)sender). Tag);
Visa = GetActiveTextView();
om (! () This.View == null || MultiSlotClipboardPackage.thePackage.Dte.ActiveDocument == null))
{
String sData = GetTextForPastie(view);
om (sData! = "")
{
InsertDataHistory (index, sData);
AccomodateDataListView(index);
}
}
}
Copy_Click() startar genom att läsa värdet för egenskapen Tag om knappen som klickade. Den här egenskapen innehåller det index som vi ska använda som slot nummer. Nästa vi anropa metoden GetActiveTextView() och kontrollera returvärdet för att se om vi fått det rätta fönstret.
Följande rader med kod får den markerade texten med metoden GetTextForPastie(). Vi kontrollerar sedan om det finns någon markerad text och så vi kallar metoden InsertDataHistory() för att infoga data i matrisen aClipboardSlotData. Slutligen, vi ändra elementen i ListView med metoden AccomodateDataListView().
Metoden InsertDataHistory() har ett enkelt jobb. Först får den index för Urklipp facket och den markerade texten. Då ska sätta in den markerade texten på den första positionen i aClipboardSlotData matrisen, som bör fungera som en stack eller LIFO datastruktur (http://en.wikipedia.org/wiki/Stack_%28abstract_data_type%29).
Istället för att genomföra en datastruktur som stack från början vi bara skapa en ny lista och infoga markerad textvärdet som skickas som en parameter i dess första position. Därefter färdas vi befintliga aClipboardSlotData matrisen start från det andra elementet och infoga data på den nya skapat lista. Slutligen, åsidosätter vi den befintliga listan på aClipboardSlotData med det vi just skapat. Följande kod visar hur dessa operationer utförs.
privata void InsertDataHistory (int indexSlot, sträng sData)
{
Lista list_temp = ny List();
list_temp. Infoga (0, sData);
för (int jag = 0; jag < aClipboadSlotData [indexSlot]. Greven - 1. i ++)
{
list_temp. Infoga (jag + 1, aClipboadSlotData [indexSlot]. ElementAt(i). ToString());
}
aClipboadSlotData [indexSlot]. RemoveRange (0, aClipboadSlotData [indexSlot]. Count);
aClipboadSlotData [indexSlot]. InsertRange (0, list_temp);
hemkomst.
}
Nu när vi förde in den markerade texten på rätt position i listan som finns inuti matrisen aClipboardSlotData måste vi uppdatera elementen i ListView. Vi gör det inuti AccomodateDataListView() metoden som får index i matrisen som en parameter.
AccomodateDataListView() är enkelt: vi radera alla ListViewItem element och införas nya i listan som finns inuti aClipboardSlotData. Vi se bara till att infoga bara 15 tecken i varje text att undvika klippa texten. Slutligen, vi be om en uppdatering på UI och välj det första elementet i ListView.
privata void AccomodateDataListView (int indexSlot)
{
ListView v = (listvy) aGroupGrids [indexSlot]. Barn [2].
v.Items.Clear();
foreach (sträng s i aClipboadSlotData[indexSlot])
{
om (! s.Equals(""))
{
om (s.Length > 15)
v.Items.Add (s.Substring (0, 15));
annat
v.Items.Add(s);
}
}
v.Items.Refresh();
v.SelectedIndex = 0;
}
Vi är nästan klar. Vi måste skapa koden för de händelser som hanterar Klicka i snittet och klistra in knapparna. Händelsen för knappen Cut är nästan samma som knappen Kopiera: den enda skillnaden är att efter får vi den markerade texten vi måste radera texten som väljs från koden fönstret och ta bort den textmarkeringen.
Om du vill radera den markerade texten måste vi använda de objekt som implementerar gränssnittet ITextEdit. Vi får detta objekt från metoden CreateEdit() i egenskapen TextBuffer finns på Visa variabeln som representerar den aktuella vyn kod redaktör. När vi får objektet ITextEdit använder vi metoden Delete() radera tecken och metoden Apply() för att ändra texten. Slutligen, vi tar bort markeringen med förloppsindikatorförekomstens metoden för egenskapen urval av vyn.
Men det finns en hake när vi använder metoden Delete(): vi måste ge den plats vi vill börja ta bort tecken och hur många tecken vi behöver ta bort. För att få positionen för den aktuella markeringen använder vi egenskapen Position från egenskapen Selection.Start, som representerar den start plats där markeringen börjar. På liknande sätt använder vi egenskapen Selection.End för att få exakta heltal positionen för slutet av markeringen. Koden för metoden delegat Cut_Click() visas nedan.
void Cut_Click (objekt avsändare, RoutedEventArgs e)
{
heltal index = Convert.ToInt32(((Button)sender). Tag);
Visa = GetActiveTextView();
om (! () This.View == null || MultiSlotClipboardPackage.thePackage.Dte.ActiveDocument == null))
{
String sData = GetTextForPastie(view);
om (sData! = "")
{
InsertDataHistory (index, sData);
AccomodateDataListView(index);
Microsoft.VisualStudio.Text.ITextEdit Redigera = Visa. TextBuffer.CreateEdit();
Redigera. Ta bort (vyn. Selection.Start.Position.Position, Visa. Selection.End.Position.Position - Visa. Selection.Start.Position.Position);
Redigera. Apply();
Visa. Selection.Clear();
}
}
}
Den slutliga delegatmetod vi måste skapa är den som hanterar händelsen klickning på knappen Klistra in. Innan vi skapar denna metod måste vi dock först utveckla ett sätt att extrahera text-elementet från array aClipboardSlotData, som är den datastruktur som lagrar slots och deras historia.
Den nya metoden som utvinner texten från en slot historia kallas getSelectedItem() och den får index för facket som en parameter. Den här metoden måste returnera datavärde från den slot historia som motsvarar till det markerade objektet på ListView. Om inget objekt är markerad på ListView bör metoden returnera det första elementet i ListView.
GetSelectedItem() första uppgift är att få motsvarande ListView med index och aGroupGrids utbud. Nästa, metoden kontrollerar om erhållna ListView är tom och om det inte är SelectedIndex-egenskapen används med arrayen aClipboardSlodData för att få elementet från den rätt platsen och rätt historia ställning.
privata sträng getSelectedItem (int indexSlot)
{
Sträng ret = "";
ListView v = (listvy) aGroupGrids [indexSlot]. Barn [2].
om (v.Items.Count > 0)
{
om (v.SelectedIndex > = 0)
{
ret = aClipboadSlotData [indexSlot]. ElementAt(v.SelectedIndex). ToString();
}
annat
ret = aClipboadSlotData [indexSlot]. ElementAt(0). ToString();
}
återvändande ret;
}
Slutligen är den sista biten av kod måste vi genomföra den delegatmetod som hantera genom att klicka på knappen Klistra in. Metoden Paste_Click() först få nuvarande Visa med hjälp av GetActiveTextView() och kontrollera om den aktuella vyn kod editor, precis som den Copy_Click() och Cut_Click() delegera metoder. Metoden anropar sedan getSelectedItem() skickas som en parameter index värderas erhålls från egenskapen Tag om knappen som klickade.
Om det finns några uppgifter om motsvarande historia och slot position, måste denna text infogas i den aktuella markörpositionen (cirkumflex). Om du vill infoga textvärdet i exakta markörens position använder vi igen det objekt som implementerar gränssnittet ITextEdit erhålls från metoden CreateEdit() för egenskapen TextBuffer, precis som vi gjorde på metoden Cut händelse. Men här ska vi använda metoden Insert() istället för Delete() och ge nuvarande carret position erhållits från egenskapen Position för egenskapen Caret.Position.BufferPostion för objektet vy. Den sista pusselbiten i koden för detta Instructable är show nedan
void Paste_Click (objekt avsändare, RoutedEventArgs e)
{
heltal index = Convert.ToInt32(((Button)sender). Tag);
Visa = GetActiveTextView();
om (! () This.View == null || MultiSlotClipboardPackage.thePackage.Dte.ActiveDocument == null))
{
String sData = getSelectedItem(index);
om (! sData.Equals(""))
{
Microsoft.VisualStudio.Text.ITextEdit Redigera = Visa. TextBuffer.CreateEdit();
Redigera. Infoga (vy. Caret.Position.BufferPosition.Position, sData);
Redigera. Apply();
}
}
}