Stap 8: Codering de gebeurtenissen
In deze stap moeten we vullen in de code voor de gebeurtenissen van de knoppen
en de ListView. Deze gebeurtenissen zijn generiek, wat betekent dat alle dynamisch gegenereerde besturingselementen noem deze gebeurtenissen. Dus, als u wilt weten welke sleuf genoemd de gebeurtenis zal lezen we de Tag-eigenschap van het besturingselement, waarin de juiste index van de matrix aClipboardSlotData.
Laten we beginnen met de gebeurtenis die het tweemaal klikken op de ListView verwerkt. Wanneer de gebruiker dubbelklikt op een ListViewItem laten we zien een berichtvenster weergegeven met de inhoud van de geselecteerde elementen.
Als de SelectedIndex van de eigenschap ListView groter dan -1 Dit is betekent dat een item is geselecteerd, en wij zullen gebruiken de waarde van deze eigenschap als een index voor de matrix die het opslaan van gegevens op het Klembord (aClipboardSlotData). De volgende code toont de inhoud van de lstData_MouseDoubleClick() gemachtigde methode.
VOID lstData_MouseDoubleClick (object afzender, MouseButtonEventArgs e)
{
ListView v = (ListView) afzender;
int index = Convert.ToInt32(v.Tag);
Als (v.SelectedIndex! = -1)
MessageBox.Show (aClipboadSlotData [index]. ElementAt(v.SelectedIndex). ToString());
}
De volgende methode van de gemachtigde moeten wij scheppen is de gebeurtenis die omgaan met de Klik op de knop kopiëren. Deze gemachtigde methode heet Copy_Click() en we moeten eerst het venster actieve code met de methode van de GetActiveView() gemaakt op stap 6 en controleer of de weergave de juiste is.
Vervolgens moeten we de huidige geselecteerde tekst lezen met de GetTextForPastie() methode die ook op stap 6 is gemaakt. Nadat we de tekst moeten we controleren als het leeg is.
Als de geselecteerde tekst niet leeg is, moeten we deze afbeelding invoegen op de matrix aClipboardSlotData. Wij voeren deze invoegen in een nieuwe methode genaamd InsertDataHistory(). Ten slotte moeten we de ListView met een andere nieuwe methode genaamd AccomodateDataListView() bijwerken. Maar eerst laten we zien de code voor de Copy_Click() methode delegeren.
VOID Copy_Click (object afzender, RoutedEventArgs e)
{
int index = Convert.ToInt32(((Button)sender). Tag);
weergave = GetActiveTextView();
Als (! () this.View == null || MultiSlotClipboardPackage.thePackage.Dte.ActiveDocument == null))
{
Delampenfabrikant koord = GetTextForPastie(view);
Als (delampenfabrikant! = "")
{
InsertDataHistory (index, delampenfabrikant);
AccomodateDataListView(index);
}
}
}
De Copy_Click() begint met het lezen van de waarde van de eigenschap label van de knop waarop werd geklikt. Deze eigenschap bevat de index die we gaan gebruiken als het nummer van de sleuf. Volgende we de GetActiveTextView()-methode aanroept en controleer de geretourneerde waarde om te zien als we got naar de juiste venster.
De volgende coderegels krijgen de geselecteerde tekst met de GetTextForPastie()-methode. Wij controleren dan als er geen geselecteerde tekst en zoja we de InsertDataHistory() methode aanroepen om de gegevens op de array aClipboardSlotData invoegen. Ten slotte, wijzigen we de elementen van de ListView met de AccomodateDataListView()-methode.
De InsertDataHistory()-methode heeft een eenvoudige baan. Eerst ontvangt het de index van de Klembord-sleuf en de geselecteerde tekst. Dan moeten de geselecteerde tekst ingevoegd op de eerste positie van de aClipboardSlotData matrix, die als een stapel of LIFO datastructuur (http://en.wikipedia.org/wiki/Stack_%28abstract_data_type%29 werken moet).
In de plaats van uitvoering van de gegevensstructuur van een stapel van kras we gewoon een nieuwe lijst maken en invoegen van de waarde van de geselecteerde tekst verzonden als een parameter in de eerste positie. Vervolgens doorlopen we de bestaande array van de aClipboardSlotData vanaf het tweede element en het invoegen van de gegevens op de nieuwe lijst gemaakt. Ten slotte, negeren we de bestaande lijst op aClipboardSlotData met de tekst die we zojuist hebt gemaakt. De volgende code toont hoe deze operaties worden uitgevoerd.
private void InsertDataHistory (int indexSlot, String delampenfabrikant)
{
Lijst van list_temp = nieuwe List();
list_temp. Invoegen (0, delampenfabrikant);
for (int i = 0; ik < aClipboadSlotData [indexSlot]. Count - 1; i ++)
{
list_temp. Invoegen (i + 1, aClipboadSlotData [indexSlot]. ElementAt(i). ToString());
}
aClipboadSlotData [indexSlot]. RemoveRange (0, aClipboadSlotData [indexSlot]. Count);
aClipboadSlotData [indexSlot]. InsertRange (0, list_temp);
terugkeer;
}
Nu dat we de geselecteerde tekst op de juiste positie van de lijst die is opgeslagen in de array aClipboardSlotData ingevoegd moeten we de elementen van de ListView bijwerken. Dat doen we binnen de AccomodateDataListView()-methode die ontvangt de index van de matrix als een parameter.
De AccomodateDataListView() is eenvoudig: we wissen van alle ListViewItem elementen en nieuwe in de volgorde van de lijst die is opgeslagen in de aClipboardSlotData ingevoegd. Wij zorg enkel ervoor invoegen alleen het 15 tekens van elke tekst om te voorkomen dat de tekst knippen. Tot slot, we vragen voor een vernieuwing op de UI en selecteer het eerste element van de ListView.
private void AccomodateDataListView (int indexSlot)
{
ListView v = (ListView) aGroupGrids [indexSlot]. Kinderen [2];
v.Items.Clear();
foreach (String s in aClipboadSlotData[indexSlot])
{
Als (! s.Equals(""))
{
Als (s.Length > 15)
v.Items.Add (s.Substring (0, 15));
anders
v.Items.Add(s);
}
}
v.Items.Refresh();
v.SelectedIndex = 0;
}
We zijn bijna klaar. We moeten de code voor de gebeurtenissen die omgaan met de Klik in het knippen en plakken knoppen maken. De gebeurtenis voor de knop Knippen is bijna hetzelfde als de knop kopiëren: het enige verschil is dat nadat we de geselecteerde tekst moeten we de tekst die is geselecteerd in het codevenster te wissen en verwijderen van de selectie van de tekst.
Als u wilt wissen van de geselecteerde tekst moeten we gebruik van het object die de ITextEdit-interface implementeren. Wij krijgen dit object van de methode van de CreateEdit() van de TextBuffer-eigenschap gevonden op de weergave-variabele die aangeeft van de huidige weergave van de code-editor. Zodra we het ITextEdit-object gebruiken we de Delete()-methode om te wissen van de tekens en de Apply()-methode om de tekst te wijzigen. Tenslotte, verwijderen we de selectie met de methode Clear() van de eigenschap Selection van de weergave.
Maar er een vangst is als we de Delete()-methode gebruiken: we moeten zorgen voor de positie die we willen begint met het verwijderen van de tekens en hoeveel tekens moeten we verwijderen. Om de positie van de huidige selectie gebruiken we de eigenschap Position van het pand van de Selection.Start, die vertegenwoordigt de start plek waar selectie begint. Op een vergelijkbare manier, we de Selection.End-eigenschap gebruiken om de positie van de exacte getal van het einde van de selectie. De code voor de methode van de gemachtigde Cut_Click() is hieronder weergegeven.
VOID Cut_Click (object afzender, RoutedEventArgs e)
{
int index = Convert.ToInt32(((Button)sender). Tag);
weergave = GetActiveTextView();
Als (! () this.View == null || MultiSlotClipboardPackage.thePackage.Dte.ActiveDocument == null))
{
Delampenfabrikant koord = GetTextForPastie(view);
Als (delampenfabrikant! = "")
{
InsertDataHistory (index, delampenfabrikant);
AccomodateDataListView(index);
Microsoft.VisualStudio.Text.ITextEdit bewerken = view. TextBuffer.CreateEdit();
bewerken. Verwijderen (weergave. Selection.Start.Position.Position, weergave. Selection.End.Position.Position - weergave. Selection.Start.Position.Position);
bewerken. Apply();
bekijken. Selection.Clear();
}
}
}
De definitieve gemachtigde methode die we moeten creëren is enerzijds dat het verwerken van de gebeurtenis click op de knop plakken. Echter voordat wij deze methode maken moeten we eerst een manier om het uittreksel van het tekstelement uit de array aClipboardSlotData, die is de gegevensstructuur die de "slots" en hun geschiedenis opslaan ontwikkelen.
De nieuwe methode die wordt de tekst opgehaald uit een sleuf geschiedenis heet getSelectedItem() en zij ontvangt de index van de sleuf als parameter. Deze methode moet terugkeren de gegevenswaarde uit de geschiedenis van de sleuf die overeenkomt met het geselecteerde item op de ListView. Als u geen item is geselecteerd op de ListView moet de methode het eerste element van de ListView retourneren.
De eerste taak van de getSelectedItem() is om de bijbehorende ListView met de index en de aGroupGrids array. Vervolgens controleert de methode als de verkregen ListView leeg is en als het niet de eigenschap SelectedIndex wordt gebruikt met de aClipboardSlodData array om het element uit de juiste sleuf en de positie van de juiste geschiedenis.
private String getSelectedItem (int indexSlot)
{
Tekenreeks ret = "";
ListView v = (ListView) aGroupGrids [indexSlot]. Kinderen [2];
Als (v.Items.Count > 0)
{
Als (v.SelectedIndex > = 0)
{
RET = aClipboadSlotData [indexSlot]. ElementAt(v.SelectedIndex). ToString();
}
anders
RET = aClipboadSlotData [indexSlot]. ElementAt(0). ToString();
}
terugkeer ret;
}
Ten slotte, het laatste stukje code die we moeten implementeren is de gemachtigde methode die omgaan met de Klik op de knop plakken. De methode Paste_Click() eerst krijgen de huidige bekijken met behulp van de GetActiveTextView() en controleren of de huidige weergave is de code-editor, net als het Copy_Click() en de Cut_Click() methoden overdragen. De methode roept vervolgens de getSelectedItem() verzenden als een parameter die de index waarde verkregen uit de eigenschap label van de knop waarop werd geklikt.
Als er gegevens over de bijbehorende geschiedenis en sleuf positie is, moet deze tekst worden ingevoegd in de huidige cursorpositie (caret). Als u wilt invoegen de tekstwaarde in de exacte cursorpositie we gebruiken opnieuw het object dat de interface van de ITextEdit verkregen uit de methode van de CreateEdit() van de TextBuffer-eigenschap, net als wij op de Cut event methode implementeren. Echter, moeten we hier de Insert() methode gebruiken in plaats van de Delete() en de huidige positie van de carret verkregen uit de eigenschap Position van de Caret.Position.BufferPostion-eigenschap van het object view. Het laatste stuk van de code van dit Instructable is Toon hieronder
VOID Paste_Click (object afzender, RoutedEventArgs e)
{
int index = Convert.ToInt32(((Button)sender). Tag);
weergave = GetActiveTextView();
Als (! () this.View == null || MultiSlotClipboardPackage.thePackage.Dte.ActiveDocument == null))
{
Delampenfabrikant koord = getSelectedItem(index);
Als (! sData.Equals(""))
{
Microsoft.VisualStudio.Text.ITextEdit bewerken = view. TextBuffer.CreateEdit();
bewerken. Invoegen (weergave. Caret.Position.BufferPosition.Position, delampenfabrikant);
bewerken. Apply();
}
}
}