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

Lädt eine RTF-Datei in eine RichTextBox und verwaltet / speichert die Formatierung

Alles, ich schreibe eine Log-Datei in eine .rtf-Datei, die Formatierung unterstrichen, fett usw. hat. Ich habe diese Datei gespeichert und möchte sie zu einem späteren Zeitpunkt wieder in RichTextBox lesen, wobei sie ihre Formatierung fortset...
18.05.2012, 17:36
4
Antworten

jQuery-Plugin, das / Autocompletes innerhalb eines Textarea schlägt [geschlossen]

Gibt es ein jQuery-Plugin, das in einem Textbereich vorschlägt / automatisch kompiliert? Was ich möchte, sind vorgeschlagene Wörter oder automatisch vervollständigte Texte, die dem Benutzer in einem Textfeld angeboten werden, wie im folgenden...
01.12.2010, 22:02
1
Antwort

WPF Reistextbox Bindbar in .net 4.5

Also versuche ich David Veenemans Bindable WPF RichTextBox hier in meinem .net 4.5 Projekt. Nach dem Hinzufügen des Steuerelements und der ValueConverter in meinem Code habe ich nur bemerkt, dass public object Convert() ausgelöst wird, a...
04.11.2015, 09:20
4
Antworten

Wie richtet man Text in RichTextBox C # aus?

Wie richte ich den Text in einer RichTextBox aus? Grundsätzlich enthält das RTB: "- Testen" "- TESTEN" "TESTEN -" "Testen -" Alle haben die gleiche Anzahl von Zeichen, aber unterschiedliche Ausrichtungen. Wie kann ich sie r...
05.06.2011, 13:54
5
Antworten

Celsius-Symbol in RichTextBox

Ich schreibe Windows-Anwendung mit C # und .NET2.0. In RichTextBox möchte ich Celsius-Symbol anzeigen. Wie es geht? Ist es möglich?     
08.10.2009, 07:23
1
Antwort

So erhalten Sie eine WPF-Rich-Textbox in eine Zeichenfolge

Ich habe gesehen, wie man ein WPF Rich-Text-Feld in RichTextBox-Klasse . Trotzdem möchte ich seinen Text wie früher in Windows Forms in der Datenbank speichern. %Vor% Wie kann ich es tun?     
08.11.2010, 15:37
2
Antworten

Wie bekomme ich RTF von RichTextBox?

Wie bekomme ich den Text in RTF von RichTextBox ? Ich versuche, so zu bekommen, aber die Eigenschaft existiert nicht. %Vor%     
02.03.2009, 10:07
3
Antworten

Windows Forms RichTextBox-Cursorposition

Ich habe ein C # Windows Forms-Programm mit einem RichTextBox-Steuerelement. Immer wenn der Text in der Box geändert wird (außer der Änderung), springt der Cursor an den Anfang zurück. Mit anderen Worten, wenn der Text in der RichTextBox mit...
11.02.2010, 02:36
6
Antworten

Wie die Nummer einer Zeile in einer RichTextBox C # angezeigt wird

Ich mache einen einfachen Text- und Skript-Editor mit Code-Hervorhebung. Dafür benutze ich eine RichTextBox. Aber ich weiß nicht, wie man die Zeilennummern auf der linken Seite wie in VS oder Notepad ++ zeigt. Gibt es eine Lösung?     
02.04.2010, 14:48
1
Antwort

Rich-Text-Editor erstellen AngularJS

Ich weiß, dass es viele großartige Rich-Text-Editoren gibt, die leicht zu eckig portiert werden können, und viele Diskussionen darüber, wie man das macht, aber ich würde gerne meine eigenen erstellen. Ich habe die Grundidee unten: Erstell...
26.04.2013, 02:43