Reputation: 1061
I have a string in the format of RTF coming from a database. The string is the following:
{\rtf1\ansi\ansicpg1252\uc1\htmautsp\deff2{\fonttbl{\f0\fcharset0 Times New Roman;}{\f2\fcharset0 Segoe UI, Lucida Sans Unicode, Verdana;}}{\colortbl\red0\green0\blue0;\red255\green255\blue255;}\loch\hich\dbch\pard\plain\ltrpar\itap0{\lang1033\fs18\f2\cf0 \cf0\ql{\f2 {\ltrch This is a sentence}\li0\ri0\sa0\sb0\fi0\ql\par}
}
}
I have the following as the DataGrid XAML code:
<DataGrid Name="dg">
<DataGrid.Columns>
<DataGridTextColumn Header="Col1" Binding="{Binding Col1}"/>
<DataGridTextColumn Header="Col1" Binding="{Binding Col1}"/>
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<RichTextBox>
<FlowDocument>
<Paragraph>
<Run Text="{Binding Text}" />
</Paragraph>
</FlowDocument>
</RichTextBox>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
The problem I am having is that the value coming from the database is being displayed but it is in the RTF format.
I am not sure as to how to convert this so that the RichTextBox will display the appropriate formatting for the text.
I have the following method which loads up the data into the RichTextBox but the problem is I need to know the name of the RichTextBox first.
public static string convertString_RTF(string text, RichTextBox rtb)
{
string rtfText = text;
byte[] byteArray = Encoding.ASCII.GetBytes(rtfText);
using (System.IO.MemoryStream ms = new System.IO.MemoryStream(byteArray))
{
System.Windows.Documents.TextRange tr = new System.Windows.Documents.TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd);
tr.Load(ms, System.Windows.DataFormats.Rtf);
}
return null;
}
What would be a solution to displaying the RTF string in the RichTextBox through binding?
Thank you in advance for your help.
Upvotes: 1
Views: 2088
Reputation: 9827
Create your own RichTextBox
, and introduce a new DependencyProperty
called TextProperty
.
public class MyRichTextBox : RichTextBox
{
public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
// Using a DependencyProperty as the backing store for Text. This enables animation, styling, binding, etc...
public static readonly DependencyProperty TextProperty =
DependencyProperty.Register("Text", typeof(string), typeof(MyRichTextBox), new PropertyMetadata(String.Empty, new PropertyChangedCallback(TextChanged_Handler)));
private static void TextChanged_Handler(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
RichTextBox rtb = d as RichTextBox;
byte[] array = Encoding.ASCII.GetBytes(e.NewValue.ToString());
using (MemoryStream stream = new MemoryStream(array))
{
TextRange t = new TextRange(rtb.Document.ContentStart,
rtb.Document.ContentEnd);
t.Load(stream, System.Windows.DataFormats.Rtf);
}
}
}
Usage :
<local:MyRichTextBox Margin="20" Text="{Binding RtfCol}" Width="300" Height="300" />
AttachedProperty
.Upvotes: 1
Reputation: 588
Because you need use RichTextBox.Load, you can't bind directly. Use a converter like this:
[ValueConversion(typeof(string), typeof(string))]
public class RTFConverter : IValueConverter
{
RichTextBox rtBox = new RichTextBox();
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
string rtf = (string)value;
convertString_RTF(rtf, rtBox);
TextRange textRange = new TextRange(rtBox.Document.ContentStart, rtBox.Document.ContentEnd);
return textRange.Text;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return null;
}
}
<Window.Resources>
<local:RTFConverter x:Key="RTFConverter"/>
</Window.Resources>
<RichTextBox x:Name="richtxt" VerticalAlignment="Bottom" >
<FlowDocument>
<Paragraph>
<Run Text="{Binding Text, Converter={StaticResource RTFConverter}}" />
</Paragraph>
</FlowDocument>
</RichTextBox>
Upvotes: 1