Freigeben über


TextBox.GetRectFromCharacterIndex(Int32, Boolean) Methode

Definition

Gibt einen rechteckigen Bereich für den vor- oder nachgestellten Rand eines Zeichens an einem bestimmten Zeichenindex zurück.

public:
 virtual Rect GetRectFromCharacterIndex(int charIndex, bool trailingEdge) = GetRectFromCharacterIndex;
Rect GetRectFromCharacterIndex(int const& charIndex, bool const& trailingEdge);
public Rect GetRectFromCharacterIndex(int charIndex, bool trailingEdge);
function getRectFromCharacterIndex(charIndex, trailingEdge)
Public Function GetRectFromCharacterIndex (charIndex As Integer, trailingEdge As Boolean) As Rect

Parameter

charIndex
Int32

int

Ein nullbasierter Index des Zeichens, für das das Rechteck abgerufen werden soll.

trailingEdge
Boolean

bool

true , um den nachgestellten Rand zu erhalten; false , um den vorderen Rand des Zeichens abzurufen.

Gibt zurück

Ein Rechteck für den Rand des Zeichens am angegebenen Index.

Beispiele

In diesem Beispiel wird gezeigt, wie Sie getRectFromCharacterIndex verwenden, um das Rechteck für den markierten Text zu bestimmen. Das vollständige Beispiel finden Sie unter Szenario 2 des ContextMenu-Beispiels.

// Returns a rect for selected text.
// If no text is selected, returns caret location.
// Text box should not be empty.
private Rect GetTextboxSelectionRect(TextBox textbox)
{
    Rect rectFirst, rectLast;
    if (textbox.SelectionStart == textbox.Text.Length)
    {
        rectFirst = textbox.GetRectFromCharacterIndex(textbox.SelectionStart - 1, true);
    }
    else
    {
        rectFirst = textbox.GetRectFromCharacterIndex(textbox.SelectionStart, false);
    }

    int lastIndex = textbox.SelectionStart + textbox.SelectionLength;
    if (lastIndex == textbox.Text.Length)
    {
        rectLast = textbox.GetRectFromCharacterIndex(lastIndex - 1, true);
    }
    else
    {
        rectLast = textbox.GetRectFromCharacterIndex(lastIndex, false);
    }

    GeneralTransform buttonTransform = textbox.TransformToVisual(null);
    Point point = buttonTransform.TransformPoint(new Point());

    // Make sure that we return a valid rect if selection is on multiple lines
    // and end of the selection is to the left of the start of the selection.
    double x, y, dx, dy;
    y = point.Y + rectFirst.Top;
    dy = rectLast.Bottom - rectFirst.Top;
    if (rectLast.Right > rectFirst.Left)
    {
        x = point.X + rectFirst.Left;
        dx = rectLast.Right - rectFirst.Left;
    }
    else
    {
        x = point.X + rectLast.Right;
        dx = rectFirst.Left - rectLast.Right;
    }

    return new Rect(x, y, dx, dy);
}

Hinweise

Um das Kontextmenü außer Kraft zu setzen, können Sie das ContextMenuOpening-Ereignis behandeln und das Standardmenü durch ein benutzerdefiniertes Menü ersetzen. Verwenden Sie GetRectFromCharacterIndex, um zu bestimmen, wo das benutzerdefinierte Menü positioniert werden soll. Ein Beispiel hierfür finden Sie im Szenario 2 in Kontextmenübeispiel. Entwurfsinformationen finden Sie unter Richtlinien für Kontextmenüs.

Da diese Methode ein Rechteck zurückgibt, das einen Zeichenrand darstellt, ist die Breite des zurückgegebenen Rechtecks immer 0. Um die Breite eines Zeichens abzurufen, müssen Sie den X-Wert des führenden Rect vom X-Wert des nachgestellten Rect subtrahieren.

Gilt für: