RIchTextBox Rtf encoding - c#

I created a richtextbox in wpf where i can select text and link it to a file or resource.
Let's say i want to add text something into textbox and add hyperlink to D:\cdrréper
I attach a part of the code:
_link.CommandParameter = path;
_link.NavigateUri = new Uri(path, UriKind.Absolute);
_link.IsEnabled = true;
using (MemoryStream ms = new MemoryStream()) {
TextRange tr = new TextRange(_link.ContentStart, _link.ContentEnd);
tr.Save(ms, DataFormats.Rtf);
richTextBox.Selection.Load(ms, DataFormats.Rtf);
}
The current text value in richtext box after load is
{\rtf1\ansi\ansicpg1252\uc1\htmautsp\deff2{\fonttbl{\f0\fcharset0 Times New Roman;}{\f2\fcharset0 Arial;}}{\colortbl\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red0\green102\blue204;}\loch\hich\dbch\pard\plain\ltrpar\itap0{\lang1033\fs18\f2\cf0 \cf0\ql{\f2 {\ul\cf3\ltrch {\field{\*\fldinst { HYPERLINK "D:\\\\cdrr'e9per" }}{\fldrslt {something}}}}\li0\ri0\sa75\sb75\fi0\ql\par}
}
}
Hyperlink value from RTF is { HYPERLINK "D:\\cdrr'e9per" }.
When i'm trying to access the path is not working because cannot be founded. é character is not encoded correctly. Do you have any suggestions about how i can fix this? Thanks for any help.

In the Hyperlink section is needed to have a \ before 'e9. When we load the rtf string into a TextRange we need to Load it as Xaml.
tr.Load(ms, DataFormats.Xaml);

Related

C# Image in rich text file not centered when loaded into rich text box

I created a rich text file in OpenOffice Writer that includes an image with its alignment centered and tried to load the file into a rich text box in my C# WinForms app. Problem is the image is aligned left instead of centered. Here's my code:
private void DisplayStartPage()
{
rtbMain.ReadOnly = false;
using (MemoryStream ms = new MemoryStream(OurProject.MainPage.StartPageContent, 0, OurProject.MainPage.StartPageContent.Length))
{
ms.Write(OurProject.MainPage.StartPageContent, 0, OurProject.MainPage.StartPageContent.Length);
ms.Position = 0;
rtbMain.LoadFile(ms, RichTextBoxStreamType.RichText);
}
rtbMain.ReadOnly = true;
}
Is this problem caused by the code above or could it be the app I used to create the rich text file?

Why LineHeight gets changed in WPF RichTexBox when reloading its content from a stream

Question: Why the following code changes the default LineHeight in WPF RichTexBox to 0? What would be a proper way to fix the issue?
Xaml for RichTextBox:
<RichTextBox x:Name="rtbTest" AcceptsTab="True" FontFamily="Calibri"/>
Code to reload content of RichTexBox from stream:
TextRange textRange = new TextRange(rtbTest.Document.ContentStart, rtbTest.Document.ContentEnd);
string rtf;
using (var memoryStream = new MemoryStream())
{
textRange.Save(memoryStream, DataFormats.Rtf);
rtf = ASCIIEncoding.Default.GetString(memoryStream.ToArray());
}
//rtf = rtf.Replace("abcd", "rstu");
using (MemoryStream stream = new MemoryStream(ASCIIEncoding.Default.GetBytes(rtf)))
{
rtbTest.SelectAll();
rtbTest.Selection.Load(stream, DataFormats.Rtf);
}
Screenshot of RichTexBox before running the above code:
Screenshot of RichTexBox AFTER running the above code:
You notice that the default LinHeight got changed to 0.
The DataFormats.Rtf format don't preserve line spacing. Use DataFormats.Xaml instead (doesn’t support images). Or even the DataFormats.XamlPackage: it will save and restore images too.

RTF string with image from WPF RichTextBox won't display in WinForms RichTextBox

The RTF string below contains an image and was created from a WPF RichTextBox. When I set the RTF string below to a WinForms RichTextBox.Rtf property the image is not displayed. How can I get the image to show in the WinForms RichTextBox?
Here is the code to create the RTF string from the WPF RichTextBox:
private static string ExportRtf(RichTextBox richTextBox)
{
var document = richTextBox.Document;
var r = new TextRange(document.ContentStart, document.ContentEnd);
using (var stream = new MemoryStream())
{
r.Save(stream, DataFormats.Rtf);
return encoding.GetString(stream.ToArray());
}
}
Here is the WPF RichTextBox display:
Here is the WinForms RichTextBox display:
Here is the RTF string:
{\rtf1\ansi\ansicpg1252\uc1\htmautsp\deff2{\fonttbl{\f0\fcharset0 Times New Roman;}{\f2\fcharset0 Calibri;}}{\colortbl\red0\green0\blue0;\red255\green255\blue255;}\loch\hich\dbch\pard\plain\ltrpar\itap0{\lang1033\fs21\f2\cf0 \cf0\ql{\f2 {\ltrch help}{\ltrch {\*\shppict{\pict\picwgoal435\pichgoal300\pngblip
424d460900000000000036000000280000001d00000014000000010020000000000000000000c40e0000c40e00000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff358f3aff358f3aff358f3aff358f3aff358f3aff358f3aff358f3aff358f3aff358f3aff358f3aff358f3aff358f3aff358f3aff358f3affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff358f3afff8f8f8fff8f8f8fff8f8f8fff8f8f8fff8f8f8fff8f8f8fff8f8f8fff8f8f8fff8f8f8fff8f8f8fff8f8f8fff8f8f8ff358f3affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe4a421ffe4a421ffe4a421ffe4a421ffe4a421ffffffffffffffffff358f3afff8f8f8fff8f8f8fff8f8f8fff8f8f8fff8f8f8fff8f8f8fff8f8f8fff8f8f8fff8f8f8fff8f8f8fff8f8f8fff8f8f8ff358f3affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe4a421ffe4a421fff8f8f8ffe4a421ffe4a421ffffffffffffffffff358f3afff8f8f8fff8f8f8ff9e9e9fff444444ff444444ffbfbfc0fff8f8f8fff8f8f8fff8f8f8fff8f8f8fff8f8f8fff8f8f8ff358f3affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe4a421ffe4a421fff8f8f8ffe4a421ffe4a421ffffffffffffffffff358f3afff8f8f8ff9e9e9fff444444ffedededfff8f8f8ffe1e1e2fff8f8f8ff444444fff8f8f8ff444444fff8f8f8fff8f8f8ff358f3affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe4a421ffe4a421ffe4a421ffe4a421ffe4a421ffffffffffffffffff358f3afff8f8f8ff444444ffcbcbccfff8f8f8fff8f8f8fff8f8f8ff444444ff444444ff444444ff444444ff444444fff8f8f8ff358f3affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff358f3afff8f8f8ff444444ffcbcbccfff8f8f8fff8f8f8fff8f8f8fff8f8f8ff444444fff8f8f8ff444444fff8f8f8fff8f8f8ff358f3affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe6b145ffeed49efff9f7f2ffefd6a4ffe5ad39fffdfefdffffffffff358f3afff8f8f8ffb4b4b5ff444444ffedededfff8f8f8ffe1e1e2ff444444ff444444ff444444ff444444ff444444fff8f8f8ff358f3afffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5ead5ffe7b44cffe3a525ffe6b248fff3e7cdffffffffffffffffff358f3afff8f8f8fff8f8f8ffb4b4b5ff444444ff444444ffb4b4b5fff8f8f8ff444444fff8f8f8ff444444fff8f8f8fff8f8f8ff358f3affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff358f3afff8f8f8fff8f8f8fff8f8f8fff8f8f8fff8f8f8fff8f8f8fff8f8f8fff8f8f8fff8f8f8fff8f8f8fff8f8f8fff8f8f8ff358f3affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff358f3afff8f8f8fff8f8f8fff8f8f8fff8f8f8fff8f8f8fff8f8f8fff8f8f8fff8f8f8fff8f8f8fff8f8f8fff8f8f8fff8f8f8ff358f3affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff358f3aff358f3aff358f3aff358f3aff358f3aff358f3aff358f3aff358f3aff358f3aff358f3aff358f3aff358f3aff358f3aff358f3affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff}}}\li0\ri0\sa0\sb0\fi0\ql\par}
}
}

richtext to byte[] and byte[] to richtext in WPF [duplicate]

How do I get the text in RTF of a RichTextBox? I'm trying to get like this, but the property does not exist.
RichTextBox rtb = new RichTextBox();
string s = rtb.Rtf;
To get the actual XAML created by the user inside of the RichTextBox:
TextRange tr = new TextRange(myRichTextBox.Document.ContentStart,
myRichTextBox.Document.ContentEnd);
MemoryStream ms = new MemoryStream();
tr.Save(ms, DataFormats.Xaml);
string xamlText = ASCIIEncoding.Default.GetString(ms.ToArray());
EDIT: I don't have code in front of me to test, but an instance of the TextRange type has a Save (to stream) method that takes a DataFormats parameter, which can be DataFormats.Rtf
There are 2 RichTextBox classes, one from the winforms framework and one from the WPF framework:
System.Windows.Controls.RichTextBox wpfBox;
System.Windows.Forms.RichTextBox winformsBox;
Only the Winforms RichTextBox has an Rtf property, the other has a Document property which contains a FlowDocument.

how to transfer data from richtextbox to another richtextbox WPF C#

hi i have a problem in displaying or transfering the data in my richtextbox to other richtextbox...
richtextbox1.Document = richtextbox2.Document; //This will be the idea..
actually what i'm planning to do is, i want to transfer my data from my database to my listview which will display as what it is
SQLDataEHRemarks = myData["remarks"].ToString();// Here is my field from my database which is set as Memo
RichTextBox NewRichtextBox = new RichTextBox();// Now i created a new Richtextbox for me to take the data from SQLDataEHRemarks...
NewRichtextBox.Document.Blocks.Clear();// Clearing
TextRange tr2 = new TextRange(NewRichtextBox.Document.ContentStart, NewRichtextBox.Document.ContentEnd);// I found this code from other forum and helps me a lot by loading data from the database....
MemoryStream ms2 = GetMemoryStreamFromString(SQLDataEHRemarks);//This will Convert to String
tr2.Load(ms2, DataFormats.Rtf);//then Load the Data to my NewRichtextbox
Now what i want to do is, im going to load this data to my ListView.. or other control like textblock or textbox...
_EmpHistoryDataCollection.Add(new EmployeeHistoryObject{
EHTrackNum = tr2.ToString() // The problem here is it will display only the first line of the paragraph.. not the whole paragraph
});
Use the Text property of the TextRange instead of .ToString()
Method to get the content of a RichTextBox as string:
public static string GetStringFromRichTextBox(RichTextBox richTextBox)
{
TextRange textRange = new TextRange(richTextBox.Document.ContentStart, richTextBox.Document.ContentEnd);
return textRange.Text;
}
Method to get the content of a RichTextBox as rich text:
public static string GetRtfStringFromRichTextBox(RichTextBox richTextBox)
{
TextRange textRange = new TextRange(richTextBox.Document.ContentStart, richTextBox.Document.ContentEnd);
MemoryStream ms = new MemoryStream();
textRange.Save(ms, DataFormats.Rtf);
return Encoding.Default.GetString(ms.ToArray());
}
Edit: You can put the rich text returned from GetRtfStringFromRichTextBox() in another RichText control by doing the following:
FlowDocument fd = new FlowDocument();
MemoryStream ms = new MemoryStream(Encoding.ASCII.GetBytes(richTextString));
TextRange textRange = new TextRange(fd.ContentStart, fd.ContentEnd);
textRange.Load(ms, DataFormats.Rtf);
richTextBox.Document = fd;
Wouldn't getting the contents of a RichTextBox as string simply be something like
the following (in VB.Net)
Dim strText as string = MyRTB.text

Categories

Resources