2011-01-06 3 views
2

Ich benutze ein DragEventArgs für ein Drop-Ereignis und habe die x, y Drop Insert-Position innerhalb einer TextBox.Wie konvertiere ich X Y Position innerhalb einer TextBox in einen Textindex?

Wie konvertieren Sie die X, Y und Index innerhalb der TextField? Ich bin extrem wichtig für mich, um diese Information herauszufinden!

Vielen Dank!

+1

Zur Klarstellung: Beabsichtigen Sie, dass Sie zum Beispiel die Zeichenfolge hatte '„California“' in einem Text, wenn und fiel etwas zwischen dem '‚i'' und der '‘ f'', dass es das Objekt in Index 4 des Textfelds einfügen würde? –

+0

Ich verwende einen PreviewDrop und möchte den alten Text mit dem versuchten Drop-Text an den richtigen Stellen zusammenstellen. Ja, das ist richtig. Ich werde den Wert nicht selbst setzen, ich werde entweder DragEventArgs.Handled auf true setzen oder nicht – user565660

Antwort

3

Sie benötigen die GetCharacterIndexFromPoint Methode der TextBox verwenden:

void textBox1_Drop(object sender, DragEventArgs e) 
{ 
    TextBox textBox = (TextBox)sender; 
    Point position = e.GetPosition(textBox); 
    int index = textBox.GetCharacterIndexFromPoint(position, true); 
    string text = (string)e.Data.GetData(typeof(string)); 
    textBox.SelectionStart = index; 
    textBox.SelectionLength = 0; 
    textBox.SelectedText = text; 
} 
+0

Vielen Dank für die Antwort. Ich habe den Code ausprobiert und GetCharacterIndexFromPoint gibt immer -1 zurück, oder es konnte nicht gefunden werden. Gibt es eine Art von Offset, die Sie tun müssen? – user565660

+0

@ user565660, merke ich, dass ich den 'snapToText' Parameter im obigen Code vergessen habe (ich habe es behoben). Erhalten Sie immer noch -1, wenn Sie für diesen Parameter "true" übergeben? Was ist der Wert von "Position"? Sie benötigen keinen Offset, da die Position bereits relativ zur 'TextBox' ist (wie im Aufruf von' GetPosition' angegeben) –

3

Hier ist eine kleine Erweiterung, die die Position Index eines Zeichens berechnet, das am nächsten an den Tropfpunkt ist. Die Methode GetCharacterIndexFromPoint gibt tatsächlich nicht die Position des nächsten Chars zurück (wie es dokumentiert ist), sondern gibt den Index des Zeichens zurück, das sich unter dem Drop-Point befindet (auch wenn der Drop-Point direkt neben der rechten Kante des Chars liegt). In diesem Fall sollte die Methode den Index des nächsten Zeichens zurückgeben, das tatsächlich näher am Abwurfpunkt liegt.

private int GetRoundedCharacterIndexFromPoint(TextBox textBox, Point dropPoint) 
{ 
    int position = textBox.GetCharacterIndexFromPoint(dropPoint, true); 

    // Check if the dropped point is actually closer to the next character 
    // or if it exceeds the righmost character in the textbox 
    // (in this case increase position by 1) 
    Rect charLeftEdge = textBox.GetRectFromCharacterIndex(position, false); 
    Rect charRightEdge = textBox.GetRectFromCharacterIndex(position, true); 
    double charWidth = charRightEdge.X - charLeftEdge.X; 
    if (dropPoint.X + charWidth/2 > charRightEdge.X) position++; 

    return position; 
} 
Verwandte Themen