none
WPF RichTextBox auslesen und neu befüllen RRS feed

  • Frage

  • Hallo alle zusammen

    Ich versuche gerade eine Control zu bauen, welches eine RichTextBox beinhaltet. Danach möchte ich dieses Control zweimal verwenden und mittels Button den Text vom ersten Control in das zweite Control kopieren.

    Leider laufe ich auch nach sehr vielem Googlen ins leere und habe keine Idee, wie ich den gesamten Inhalt der RTF Box auslese und wieder einfüge.

    Folgenden Code habe ich:

        public partial class ucRTFBox : UserControl
        {
            public ucRTFBox()
            {
                InitializeComponent();
            }
    
            private string myRTFText = string.Empty;
    
            public string RTFText
            {
                get {
                    TextRange tr = new TextRange(myRTFBox.Document.ContentStart, myRTFBox.Document.ContentEnd);
                    return tr.ToString() ; 
                    }
                set
                {
                    myRTFText = value;
                    //myRTFBox.rtf = value;
                    //myRTFBox.value = value;
                }
            }

    Und dann

    <UserControl x:Class="ewWPFelemente.ucRTFBox"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 mc:Ignorable="d" 
                 d:DesignHeight="300" d:DesignWidth="300">
        <DockPanel Name="dpBox" LastChildFill="True" LostFocus="dpBox_LostFocus" GotFocus="dpBox_GotFocus">
            <StackPanel Name="spFormatierung" DockPanel.Dock="Top"  Orientation="Horizontal" Visibility="Collapsed">
                <Button Name="btnFett" Click="btnFett_Click"> F </Button>
                <Button Name="btnKursiv" Click="btnKursiv_Click"> K </Button>
                <Label Content="v0.02" />
            </StackPanel>
            <RichTextBox Name="myRTFBox" />
        </DockPanel>
    </UserControl>

    Vielen Dank für Hilfestellung

    Donnerstag, 21. August 2014 16:10

Antworten

Alle Antworten

  • Hallo,
    du musst lediglich die Document-Eigenschaft auslesen bzw. zuweisen. Diese enthällt ein Flussdoikument, welches den gesamten Inhalt darstellt.

    Definiere deine Eigenschaft also wie folgt:

    public FlowDocument RTFText
    {
      get {
        return myRTFBox.Document;
      }
      set
      {
        myRTFBox.Document = value;
      }
    }


    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets


    Donnerstag, 21. August 2014 16:33
    Moderator
  • Guten Abend Tom

    Vielen lieben Dank für Deine Antwort. Das klingt ja sehr einleuchtend. Habe meinen Code wie von Dir vorgeschlagen umgebaut. Nun bekomme ich bei Set  myRTFBox.Document = Value die Fehlermeldung: "das dokument ist bereits im besitz einer anderen richtextbox". Google zeigt mir nicht viel hilfreiches zum Thema.

    Ich kopiere vom einen Control zum anderen mit folgedem Code:

            private void btnCopy_Click(object sender, RoutedEventArgs e)
            {
                FlowDocument myDocument = new FlowDocument() ;
                myDocument = rtfBoxQuelle.RTFText;
                rtfBoxZiel.RTFText = myDocument;
            }

    Ich habe geglaubt, dass dies ev mit byval und byref zu tun haben könnte. Aber dies kommt, wenn ich richtig verstehe, nur bei Funktionen zur Anwendung und wäre immer byval...

    Hast Du mir noch eine kleine Idee?

    Vielen lieben Dank und beste Grüsse

    Donnerstag, 21. August 2014 20:29
  • Hallo,

    ByVal und ByRef hat nichts mit C# oder .NET zu tun. ByVal würde einen Parameter als Wert und BeRef nur eine Referenz auf den Wert übergeben. In C# werden Klassen immer als ByRef und Strukturen als ByVal oder als ByRef (mit ref-Option) übergeben.

    Der Fehler tritt auf, weil das selbe Flussdokument nur in einer RichTextBox angezeigt werden kann. Wäre das nicht der Fall, würde eine Änderung in RTB1 auch in RTB2 auftauchen.

    Du musst also das Flussdokument kopieren:

    using (var memStream = new MemoryStream())
    {
        XamlWriter.Save(rtfBoxQuelle.RTFText, memStream);
        memStream.Seek(0, SeekOrigin.Begin);
        rtfBoxZiel.RTFText = (FlowDocument)XamlReader.Load(memStream);
    }
    Der Code schreibt einfach das Dokument in den MemoryStream, setzt den Zeiger wieder an den Anfang und parsed das Dokument wieder aus dem Stream heraus.


    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Donnerstag, 21. August 2014 20:52
    Moderator
  • Megalieben Dank. Die Theorie war mir aufgrund der Fehlermeldung verständlich. An einen Stream hätte ich nie gedacht. Leuchtet mir aber ein. Dank Dir habe ich nun auch noch eine Lösung.

    Ev für andere Anfänger wie mich, XamlWriter.Save ist in using System.Windows.Markup; vorhanden.

    Wünsche Dir eine superangenehme Nachtruhe und vielen Dank.

    Donnerstag, 21. August 2014 21:00