Frage

Ich bin Rendering von Text mit FormattedText, aber es scheint eine Möglichkeit zu sein pro-char Treffertests auf der gerenderten Ausgabe auszuführen. Es ist schreibgeschützt, so dass nur ich im Grunde Auswahl benötigen, keine Bearbeitung.

würde ich RichTextBox oder ähnliches verwenden, aber ich brauche Text Ausgabe basierend auf Steuercodes in den Text einzubetten selbst, so dass sie nicht immer Nest, das die richtigen Inline-Elemente sehr komplex macht das Bauen. Ich bin auch ein bisschen besorgt über die Leistung mit dieser Lösung; Ich habe eine große Anzahl von Leitungen und neue Linien werden oft angehängt.

Ich habe bei GlyphRun sah, scheint es, ich von ihm oder einem verwandten Klasse Hit-Test bekommen konnte, aber ich würde viel Funktionalität werden Neuimplementierung, und es scheint, wie es sollte ein einfacher Weg sein ...

Kennt jemand eine gute Möglichkeit, dies zu implementieren?

War es hilfreich?

Lösung

Der beste Weg ist es, eine gute Datenstruktur zu entwerfen, für Ihren Text zu speichern, die Auffassung, auch hit-Tests. Ein Beispiel könnte sein, den Text in Blöcke (Wörter, Zeilen oder Absätze je nachdem, was Sie brauchen) zu teilen. Dann wird jeder solcher Block sollte eine Bounding-Box aufweisen, die in beliebigen Formatierungsoperationen neu berechnet werden sollten. Sehen Sie sich auch caret Positionen in Ihrem Design.

Wenn Sie eine solche Einrichtung haben es sehr einfach wird hit-Tests zu tun, verwenden Sie einfach die Begrenzungskästen. Es wird auch in nachfolgenden Operationen helfen wie einen bestimmten Teil des Textes hervorheben.

Andere Tipps

Sie können die Geometrie jedes Zeichen aus einem FormattedText Objekt erhalten und die Grenzen der einzelnen Zeichen verwenden, um den Treffer testen.

var geometry = (GeometryGroup)((GeometryGroup)text.BuildGeometry(new Point(0, 0))).Children[0];
foreach (var c in geometry.Children)
{
  if (c.Bounds.Contains(point))
    return index;
  index++;
}

In OnRender Sie diese Geometrie Objekte anstelle des formatierten Text darstellen kann.

Völlig einverstanden mit Sesh - der einfachste Weg, die Sie nicht bekommen sind weg eine ganze Menge FormattedText Funktionalität Neuimplementierung wird durch Aufspaltung der einzelnen Elemente, die Sie in ihre eigenen Kontrollen treffen Test sein wollen / inlines.

Betrachten wir ein Textblock mit und das Hinzufügen jedes Wort, wie die der Inline (oder), dann entweder binden an die IsMouseDirectlyOver Eigenschaft inline, unsere Add Delegierten der MouseEnter- & Leave Ereignisse.

Wenn Sie auf Pixelebene Treffertests der tatsächlichen Glyphen tun wollen (dh ist die Maus genau in dem Punkt dieses ‚i‘), dann werden Sie brauchen GlyphRuns zu verwenden und zu tun manuelle Treffertests auf den Glyphen ( lesen:. harte Arbeit)

Ich bin sehr spät zum Party - wenn die Partei nicht vorbei ist, und Sie den eigentlichen Charakter Geometrie nicht brauchen, ich so etwas wie dies nützlich gefunden:

 for (int i = 0; i < FormattedText.Text.Length; i++)
 {
            characterHighlightGeometry = FormattedText.BuildHighlightGeometry(new Point(), i, 1);
            CharacterHighlightGeometries.Children.Add(characterHighlightGeometry);
 }

BuildGeometry () nur den tatsächlichen Pfad Geometrie eines Zeichens. BuildHighlightGeometry () erzeugt, um die äußeren Grenzen aller Zeichen - einschließlich Räume, so zu einem Raum ein Index kann lokalisiert werden:

 foreach (var c in CharacterHighlightGeometries.Children)
        {
            if (c.Bounds.Contains(centerpoint))
            {
                q = c;
                cpos = index;
                break;
            }
            index++;
        }

Hope, das hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top