richtextbox

___ tag123wpf ___ Windows Presentation Foundation oder WPF ist ein Subsystem zum Rendern von Benutzeroberflächen in Windows-basierten Anwendungen. ___ qstnhdr ___ Wie verfolgen Sie den TextPointer in WPF RichTextBox? ___ tag123richttextbox ___ Mit dem RichTextBox-Steuerelement können Sie RTF-Inhalte (Rich Text Format) anzeigen oder bearbeiten. Dieser Inhalt kann formatierte Absätze, Hyperlinks und eingebettete Bilder enthalten. ___ qstntxt ___

Ich versuche, die TextPointer-Klasse in einer WPF RichTextBox zu verstehen.

Ich möchte in der Lage sein, sie im Auge zu behalten, damit ich Informationen mit Bereichen im Text verknüpfen kann.

Ich arbeite derzeit an einem sehr einfachen Beispiel, um herauszufinden, was vor sich geht. Im PreviewKeyDown-Event speichere ich die Caret-Position und dann im PreviewKeyUp-Event einen TextRange basierend auf den Vor- und Nach-Caret-Positionen. Hier ist ein Codebeispiel, das veranschaulicht, was ich versuche zu tun:

%Vor%

Das Problem ist, dass der Text, den ich bekomme, leer ist. Wenn ich zum Beispiel das Zeichen 'a' eintippe, würde ich erwarten, den Text "a" im TextRange zu finden.

Weiß jemand, was schief läuft? Es könnte etwas sehr einfaches sein, aber ich habe einen Nachmittag damit verbracht, nirgendwohin zu kommen.

Ich versuche, die neue WPF-Technologie zu nutzen, finde aber, dass insbesondere die RichTextBox so kompliziert ist, dass selbst solche einfachen Dinge schwierig werden. Wenn jemand irgendwelche Links hat, die den TextPointer gut erklären, würde ich mich freuen, wenn Sie es mich wissen lassen können.

    
___ tag123c ___ C # (sprich "Cis") ist eine objektorientierte Programmiersprache auf hohem Niveau, die zum Erstellen einer Vielzahl von Anwendungen entwickelt wurde, die auf dem .NET Framework (oder .NET Core) ausgeführt werden. C # ist einfach, leistungsfähig, typsicher und objektorientiert. ___ answer3047965 ___

Wenn Sie Text aus einem FlowDocument hinzufügen und entfernen, passen alle TextPointer ihre Position basierend auf einer Anzahl von Heuristiken an, die dafür sorgen, dass sie so nahe wie möglich am "Ort" bleiben.

Das Löschen ist einfach: Wenn sich der TextPointer im gelöschten Text befindet, endet er zwischen den Zeichen, die den gelöschten Text umgeben haben. Aber für Einfügungen ist es nicht so einfach: Wenn Text oder andere Elemente genau in einen bestehenden TextPointer in ein FlowDocument eingefügt werden, sollte der TextPointer vor oder nach dem eingefügten Text enden? TextPointer hat eine Eigenschaft namens "LogicalDirection", die dies steuert.

Was in Ihrem Fall passiert, ist, dass die Position "caretBefore", die Sie erfassen, genau die Textposition ist, in der das eingegebene Zeichen eingefügt wird, und in Ihren Testfällen ist Ihre logische Richtung LogicalDirection.Forward. Wenn also das Zeichen eingefügt wird, endet Ihr "cavetBefore" nach das eingefügte Zeichen, das mit TextPosition übereinstimmt und Ihnen einen leeren TextRange gibt.

Wie bekommt ein TextPointer eine LogicalDirection zugewiesen? Wenn Sie auf die RichTextBox klicken, um die Caret-Position festzulegen, wird der Klick als zwischen zwei Zeichen interpretiert interpretiert. Wenn der tatsächliche Punkt, auf den Sie geklickt haben, auf dem zweiten Zeichen lag, ist LogicalDirection auf Forward festgelegt, aber wenn der tatsächliche Punkt, auf den Sie geklickt haben, das erste Zeichen war, wird LogicalDirection auf Rückwärts festgelegt.

Versuchen Sie dieses Experiment:

  1. Setzen Sie FontSize="40" und füllen Sie die RichTextBox mit dem Text "ABCD" im Konstruktor
  2. auf
  3. Klicken Sie auf die rechte Seite des B und tippen Sie ein "X" zwischen B und C. LogicalDirection ist Rückwärts, so dass Ihr "beforeCaret" vor dem "X" steht und Ihre MessageBox das "X".
  4. Klicken Sie auf die linke Seite des C und geben Sie ein "X" zwischen dem B und dem C ein. LogicalDirection ist Forward, so dass Ihr "beforeCaret" nach dem "X" endet und Ihre MessageBox leer ist.

Dieses Verhalten ist kontraintuitiv: Wenn Sie nicht wissen, dass LogicalDirection existiert, würden Sie denken, dass ein Klick auf die rechte Seite von B oder die linke Seite von C Ihnen genau die gleiche Caret-Position geben würde.

Hinweis: Eine einfache Möglichkeit, um zu visualisieren, was vor sich geht, ist, dass Sie Ihre MessageBox.Show befehlen und stattdessen %code%

eingeben

Wie erreichen Sie das gewünschte Ergebnis? LogicalDirection ist schreibgeschützt. Eine Möglichkeit besteht darin, TextRange zu verwenden, um den Aufbau eines TextPointer mit einer logischen Rückwärtsrichtung zu erzwingen:

%Vor%

Machen Sie das in PreviewKeyDown. Wenn Sie bis PreviewKeyUp warten, ist es schon zu spät: caretBefore ist umgezogen. Das funktioniert, denn soweit ich das beurteilen kann, hat der Start einer nicht leeren TextRange immer eine logische Rückwärtsrichtung.

Eine andere Option ist das Speichern des Symboloffsets vom Anfang des Dokuments (beachten Sie, dass dies kein Zeichenoffset ist!). In diesem Fall könnten Sie den Offset in PreviewKeyDown speichern:

%Vor%

und setzen Sie caretBefore auf den gleichen Symbol-Offset in PreviewKeyUp zurück:

%Vor%

Obwohl dies funktioniert, ist es nicht so allgemein wie den TextPointer zu zwingen, eine Rückwärts-LogicalDirection zu haben: Alle Textänderungen früher im Dokument zwischen PreviewKeyDown und PreviewKeyUp verursachen, dass die Symbol-Offset-Berechnung den falschen Ort findet, was TextPointers ist wurden entwickelt, um in erster Linie zu beheben.

Ich kenne keine guten Quellen, um etwas über TextPointer zu lernen, außer das Lesen der Dokumentation und das Spielen mit ihnen, was genau das ist, was Sie bereits getan haben.

    
___
3
Antworten

Wie verschiebe ich das Caret um eine bestimmte Anzahl von Positionen in einer WPF RichTextBox?

Ich möchte den Caret um 4 Positionen nach rechts verschieben, wo mein Caret momentan ist. Ich bin für PreviewKeyDown registriert und rufe InsertTextInRun() auf, wenn der Tab-Schlüssel erfasst wird, wie folgt: %Vor% Das Problem besteht...
23.03.2010, 02:53
1
Antwort

RichTextBox-Steuerelement, wodurch Nicht-URL-Hyperlinks erstellt werden?

In einer Richtextbox sehe ich, dass DetectURLs und ein Ereignis dazu gehören ... Gibt es eine Möglichkeit, ein Wort oder eine Reihe von Wörtern als Hyperlink einzurichten, obwohl sie kein Hyperlink sind? Meine spezielle Verwendung ist, dass i...
06.10.2009, 17:04
3
Antworten

WPF FlowDocument - Absolute Zeichenposition

Ich habe eine WPF RichTextBox, in die ich etwas Text eintippe und dann den gesamten Text analysiere, um die Bearbeitung durchzuführen. Während dieses Parsens habe ich die absoluten Zeichenpositionen von Anfang und Ende jedes Wortes. Ich möcht...
02.04.2010, 08:45
1
Antwort

Autoscrolling in RichTextBox C # WinForms [duplizieren]

Wie kann ich das tun, wenn ich etwas Text anfüge, wird die RTB automatisch nach unten scrollen? Jetzt verwende ich: %Vor% Aber es funktioniert nicht gut. Manchmal scrollt es nicht bis zum Ende, sondern eine Zeile vor dem Ende. Ma...
05.10.2012, 15:20
1
Antwort

Gibt es eine Möglichkeit, ein australisches Englisch-Wörterbuch in WPF zu verwenden?

Also kann ich in WPF ein Rich Text Box wie folgt deklarieren %Vor% und durch ein Wunder tauchen kleine Wibbellinien unter falsch geschriebenen Wörtern auf. Aber der verwendete Dialekt ist ein Amerikaner, der alle möglichen Unterschiede au...
21.11.2011, 03:05
2
Antworten

Markieren Sie bei der Auswahl mit TextPointern keine Zeilenumbrüche

Also habe ich ein RichTextBox (siehe unten), das eine Schriftart mit gleichem Abstand hat und in jeder Zeile die gleiche Anzahl von Zeichen haben muss. Dazu müssen Sie nach jedem \n -Zeichen in der Zeichenfolge, die die Box eingibt, ein x...
20.11.2016, 20:02
3
Antworten

Wie optimiere ich den HTML-Text, der mit GWT aus MS Word kopiert wurde?

Ich habe ein Problem mit RichTextArea s, mein Problem ist also: Wenn ich den kopierten Text von Ms Word oder OpenOffice in RichTextArea einfügen, behält es alle Textstile bei und das ist perfekt. Aber eine schlechte Sache ist, es ist HTML-Tex...
28.05.2011, 13:24
2
Antworten

Formatieren Sie Text in Rich Text Box

Wie kann ich Text in Rich Text Box wie folgt formatieren    02/11/2010 - 17:15 - Adam: Ein weiterer Testbericht wurde am 2. hinzugefügt   November       02/11/2010 - 05:14 PM - Z_kas: Testnotizen.                         STUFE GEÄNDERT:...
02.11.2010, 12:25
3
Antworten

Inkonsistente Ergebnisse mit RichTextBox ScrollToCaret

Ich arbeite mit einer RichTextBox in C #. Es existiert auf einer TabPage. Wenn die TabPage ausgewählt ist, möchte ich die RichTextBox auffüllen und bis zum Ende scrollen. Ich habe die kleinen Variationen der Lösungen für diese gemeinsame Frage a...
16.12.2011, 13:49
7
Antworten

Entfernen von Größenänderungs-Handlern in contentEditable div

Ich habe ein contentEditable div erstellt, um es als Rich Textarea zu verwenden. Es hat Resize-Handler darum herum, die ich gerne loswerden würde. Irgendeine Idee, wie ich das machen würde? Bearbeiten: Dies scheint zu geschehen, weil ich das...
18.12.2009, 05:43