Category / Section
How to implement RtfText property for WPF RichTextBoxAdv control?
2 mins read
You can bind RTF text with the SfRichTextBoxAdv content by implementing an extension class with the RtfText property.
Please refer to the following code samples.
C#
/// <summary> /// Represents the extension class for SfRichTextBoxAdv. /// </summary> public class SfRichTextBoxAdvExtension : SfRichTextBoxAdv { #region Fields bool skipUpdating = false; #endregion #region Properties /// <summary> /// Gets or sets the RTF text. /// </summary> public string RtfText { get { return (string)GetValue(RtfTextProperty); } set { SetValue(RtfTextProperty, value); } } #endregion #region Constructor /// <summary> /// Initializes the instance of the SfRichTextBoxAdvExtension class. /// </summary> public SfRichTextBoxAdvExtension() { // Wires the ContentChanged event. this.ContentChanged += RTE_ContentChanged; } #endregion #region Static Dependency Properties
/// <summary>
/// Using this as a backing store for the RtfText dependency property to enable styling, animation, etc.
/// </summary>
public static readonly DependencyProperty RtfTextProperty = DependencyProperty.Register("RtfText", typeof(string), typeof(SfRichTextBoxAdvExtension), new PropertyMetadata(string.Empty, new PropertyChangedCallback(OnRtfTextChanged)));
#endregion #region Static Events /// <summary> /// Called when the RTF text changes. /// </summary> /// <param name="obj"></param> /// <param name="e"></param> private static void OnRtfTextChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) { SfRichTextBoxAdvExtension richTextBox = (SfRichTextBoxAdvExtension)obj; //Update the document with the RTF. richTextBox.UpdateDocument((string)e.NewValue); } #endregion #region Events /// <summary> /// Called when content changes in SfRichTextBoxAdv. /// </summary> /// <param name="obj"></param> /// <param name="args"></param> void RTE_ContentChanged(object obj, ContentChangedEventArgs args) { if (this.Document != null) { // To skip internal updation of document on setting the RtfText property. skipUpdating = true; Stream stream = new MemoryStream(); // Saves the document as an Rtf Stream. this.Save(stream, FormatType.Rtf); stream.Position = 0; // Reads the stream and assigns the string to the RtfText property using (StreamReader reader = new StreamReader(stream)) { this.RtfText = reader.ReadToEnd(); } skipUpdating = false; } } #endregion #region Implementation /// <summary> /// Updates the document. /// </summary> /// <param name="rtfText">The Rtf text.</param> private void UpdateDocument(string rtfText) { // If the Rtf text property is set internally, skip updating the document. if (!skipUpdating && !string.IsNullOrEmpty(rtfText)) { Stream stream = new MemoryStream(); // Convert the Rtf string to byte array. byte[] bytes = Encoding.UTF8.GetBytes(rtfText); // Writes the byte array to stream. stream.Write(bytes, 0, bytes.Length); stream.Position = 0; //Load the Rtf stream. Load(stream, FormatType.Rtf); } } /// <summary> /// Disposes of the instance. /// </summary> public void Dispose() { this.ContentChanged -= RTE_ContentChanged; ClearValue(RtfTextProperty); base.Dispose(); } #endregion }
XAML
<local:SfRichTextBoxAdvExtension x:Name="richTextBoxAdv" Grid.Row="2" RtfText="{Binding RtfText, Mode=TwoWay}" LayoutType="Continuous" EnableMiniToolBar="False" FontFamily="Arial" FontSize="12" DocumentTitle="Note 1"/>