Init
This commit is contained in:
@@ -0,0 +1,26 @@
|
||||
/*************************************************************************************
|
||||
|
||||
Extended WPF Toolkit
|
||||
|
||||
Copyright (C) 2007-2013 Xceed Software Inc.
|
||||
|
||||
This program is provided to you under the terms of the Microsoft Public
|
||||
License (Ms-PL) as published at http://wpftoolkit.codeplex.com/license
|
||||
|
||||
For more features, controls, and fast professional support,
|
||||
pick up the Plus Edition at http://xceed.com/wpf_toolkit
|
||||
|
||||
Stay informed: follow @datagrid on Twitter or Like http://facebook.com/datagrids
|
||||
|
||||
***********************************************************************************/
|
||||
|
||||
using System.Windows.Documents;
|
||||
|
||||
namespace Xceed.Wpf.Toolkit
|
||||
{
|
||||
public interface ITextFormatter
|
||||
{
|
||||
string GetText( FlowDocument document );
|
||||
void SetText( FlowDocument document, string text );
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
/*************************************************************************************
|
||||
|
||||
Extended WPF Toolkit
|
||||
|
||||
Copyright (C) 2007-2013 Xceed Software Inc.
|
||||
|
||||
This program is provided to you under the terms of the Microsoft Public
|
||||
License (Ms-PL) as published at http://wpftoolkit.codeplex.com/license
|
||||
|
||||
For more features, controls, and fast professional support,
|
||||
pick up the Plus Edition at http://xceed.com/wpf_toolkit
|
||||
|
||||
Stay informed: follow @datagrid on Twitter or Like http://facebook.com/datagrids
|
||||
|
||||
***********************************************************************************/
|
||||
|
||||
using System.Windows.Documents;
|
||||
|
||||
namespace Xceed.Wpf.Toolkit
|
||||
{
|
||||
/// <summary>
|
||||
/// Formats the RichTextBox text as plain text
|
||||
/// </summary>
|
||||
public class PlainTextFormatter : ITextFormatter
|
||||
{
|
||||
public string GetText( FlowDocument document )
|
||||
{
|
||||
return new TextRange( document.ContentStart, document.ContentEnd ).Text;
|
||||
}
|
||||
|
||||
public void SetText( FlowDocument document, string text )
|
||||
{
|
||||
new TextRange( document.ContentStart, document.ContentEnd ).Text = text;
|
||||
}
|
||||
}
|
||||
}
|
||||
65
Src/Xceed.Wpf.Toolkit/RichTextBox/Formatters/RtfFormatter.cs
Normal file
65
Src/Xceed.Wpf.Toolkit/RichTextBox/Formatters/RtfFormatter.cs
Normal file
@@ -0,0 +1,65 @@
|
||||
/*************************************************************************************
|
||||
|
||||
Extended WPF Toolkit
|
||||
|
||||
Copyright (C) 2007-2013 Xceed Software Inc.
|
||||
|
||||
This program is provided to you under the terms of the Microsoft Public
|
||||
License (Ms-PL) as published at http://wpftoolkit.codeplex.com/license
|
||||
|
||||
For more features, controls, and fast professional support,
|
||||
pick up the Plus Edition at http://xceed.com/wpf_toolkit
|
||||
|
||||
Stay informed: follow @datagrid on Twitter or Like http://facebook.com/datagrids
|
||||
|
||||
***********************************************************************************/
|
||||
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using System.Windows;
|
||||
using System.Windows.Documents;
|
||||
|
||||
namespace Xceed.Wpf.Toolkit
|
||||
{
|
||||
/// <summary>
|
||||
/// Formats the RichTextBox text as RTF
|
||||
/// </summary>
|
||||
public class RtfFormatter : ITextFormatter
|
||||
{
|
||||
public string GetText( FlowDocument document )
|
||||
{
|
||||
TextRange tr = new TextRange( document.ContentStart, document.ContentEnd );
|
||||
using( MemoryStream ms = new MemoryStream() )
|
||||
{
|
||||
tr.Save( ms, DataFormats.Rtf );
|
||||
return ASCIIEncoding.Default.GetString( ms.ToArray() );
|
||||
}
|
||||
}
|
||||
|
||||
public void SetText( FlowDocument document, string text )
|
||||
{
|
||||
try
|
||||
{
|
||||
//if the text is null/empty clear the contents of the RTB. If you were to pass a null/empty string
|
||||
//to the TextRange.Load method an exception would occur.
|
||||
if( String.IsNullOrEmpty( text ) )
|
||||
{
|
||||
document.Blocks.Clear();
|
||||
}
|
||||
else
|
||||
{
|
||||
TextRange tr = new TextRange( document.ContentStart, document.ContentEnd );
|
||||
using( MemoryStream ms = new MemoryStream( Encoding.ASCII.GetBytes( text ) ) )
|
||||
{
|
||||
tr.Load( ms, DataFormats.Rtf );
|
||||
}
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
throw new InvalidDataException( "Data provided is not in the correct RTF format." );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
/*************************************************************************************
|
||||
|
||||
Extended WPF Toolkit
|
||||
|
||||
Copyright (C) 2007-2013 Xceed Software Inc.
|
||||
|
||||
This program is provided to you under the terms of the Microsoft Public
|
||||
License (Ms-PL) as published at http://wpftoolkit.codeplex.com/license
|
||||
|
||||
For more features, controls, and fast professional support,
|
||||
pick up the Plus Edition at http://xceed.com/wpf_toolkit
|
||||
|
||||
Stay informed: follow @datagrid on Twitter or Like http://facebook.com/datagrids
|
||||
|
||||
***********************************************************************************/
|
||||
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using System.Windows;
|
||||
using System.Windows.Documents;
|
||||
|
||||
namespace Xceed.Wpf.Toolkit
|
||||
{
|
||||
/// <summary>
|
||||
/// Formats the RichTextBox text as Xaml
|
||||
/// </summary>
|
||||
public class XamlFormatter : ITextFormatter
|
||||
{
|
||||
public string GetText( System.Windows.Documents.FlowDocument document )
|
||||
{
|
||||
TextRange tr = new TextRange( document.ContentStart, document.ContentEnd );
|
||||
using( MemoryStream ms = new MemoryStream() )
|
||||
{
|
||||
tr.Save( ms, DataFormats.Xaml );
|
||||
return ASCIIEncoding.Default.GetString( ms.ToArray() );
|
||||
}
|
||||
}
|
||||
|
||||
public void SetText( System.Windows.Documents.FlowDocument document, string text )
|
||||
{
|
||||
try
|
||||
{
|
||||
//if the text is null/empty clear the contents of the RTB. If you were to pass a null/empty string
|
||||
//to the TextRange.Load method an exception would occur.
|
||||
if( String.IsNullOrEmpty( text ) )
|
||||
{
|
||||
document.Blocks.Clear();
|
||||
}
|
||||
else
|
||||
{
|
||||
TextRange tr = new TextRange( document.ContentStart, document.ContentEnd );
|
||||
using( MemoryStream ms = new MemoryStream( Encoding.ASCII.GetBytes( text ) ) )
|
||||
{
|
||||
tr.Load( ms, DataFormats.Xaml );
|
||||
}
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
throw new InvalidDataException( "Data provided is not in the correct Xaml format." );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
167
Src/Xceed.Wpf.Toolkit/RichTextBox/RichTextBox.cs
Normal file
167
Src/Xceed.Wpf.Toolkit/RichTextBox/RichTextBox.cs
Normal file
@@ -0,0 +1,167 @@
|
||||
/*************************************************************************************
|
||||
|
||||
Extended WPF Toolkit
|
||||
|
||||
Copyright (C) 2007-2013 Xceed Software Inc.
|
||||
|
||||
This program is provided to you under the terms of the Microsoft Public
|
||||
License (Ms-PL) as published at http://wpftoolkit.codeplex.com/license
|
||||
|
||||
For more features, controls, and fast professional support,
|
||||
pick up the Plus Edition at http://xceed.com/wpf_toolkit
|
||||
|
||||
Stay informed: follow @datagrid on Twitter or Like http://facebook.com/datagrids
|
||||
|
||||
***********************************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Windows;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Threading;
|
||||
|
||||
namespace Xceed.Wpf.Toolkit
|
||||
{
|
||||
public class RichTextBox : System.Windows.Controls.RichTextBox
|
||||
{
|
||||
#region Private Members
|
||||
|
||||
private bool _preventDocumentUpdate;
|
||||
private bool _preventTextUpdate;
|
||||
|
||||
#endregion //Private Members
|
||||
|
||||
#region Constructors
|
||||
|
||||
public RichTextBox()
|
||||
{
|
||||
}
|
||||
|
||||
public RichTextBox( System.Windows.Documents.FlowDocument document )
|
||||
: base( document )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
#endregion //Constructors
|
||||
|
||||
#region Properties
|
||||
|
||||
#region Text
|
||||
|
||||
public static readonly DependencyProperty TextProperty = DependencyProperty.Register( "Text", typeof( string ), typeof( RichTextBox ), new FrameworkPropertyMetadata( String.Empty, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnTextPropertyChanged, CoerceTextProperty, true, UpdateSourceTrigger.LostFocus ) );
|
||||
public string Text
|
||||
{
|
||||
get
|
||||
{
|
||||
return ( string )GetValue( TextProperty );
|
||||
}
|
||||
set
|
||||
{
|
||||
SetValue( TextProperty, value );
|
||||
}
|
||||
}
|
||||
|
||||
private static void OnTextPropertyChanged( DependencyObject d, DependencyPropertyChangedEventArgs e )
|
||||
{
|
||||
( ( RichTextBox )d ).UpdateDocumentFromText();
|
||||
}
|
||||
|
||||
private static object CoerceTextProperty( DependencyObject d, object value )
|
||||
{
|
||||
return value ?? "";
|
||||
}
|
||||
|
||||
#endregion //Text
|
||||
|
||||
#region TextFormatter
|
||||
|
||||
public static readonly DependencyProperty TextFormatterProperty = DependencyProperty.Register( "TextFormatter", typeof( ITextFormatter ), typeof( RichTextBox ), new FrameworkPropertyMetadata( new RtfFormatter(), OnTextFormatterPropertyChanged ) );
|
||||
public ITextFormatter TextFormatter
|
||||
{
|
||||
get
|
||||
{
|
||||
return ( ITextFormatter )GetValue( TextFormatterProperty );
|
||||
}
|
||||
set
|
||||
{
|
||||
SetValue( TextFormatterProperty, value );
|
||||
}
|
||||
}
|
||||
|
||||
private static void OnTextFormatterPropertyChanged( DependencyObject d, DependencyPropertyChangedEventArgs e )
|
||||
{
|
||||
RichTextBox richTextBox = d as RichTextBox;
|
||||
if( richTextBox != null )
|
||||
richTextBox.OnTextFormatterPropertyChanged( ( ITextFormatter )e.OldValue, ( ITextFormatter )e.NewValue );
|
||||
}
|
||||
|
||||
protected virtual void OnTextFormatterPropertyChanged( ITextFormatter oldValue, ITextFormatter newValue )
|
||||
{
|
||||
this.UpdateTextFromDocument();
|
||||
}
|
||||
|
||||
#endregion //TextFormatter
|
||||
|
||||
#endregion //Properties
|
||||
|
||||
#region Methods
|
||||
|
||||
protected override void OnTextChanged( System.Windows.Controls.TextChangedEventArgs e )
|
||||
{
|
||||
base.OnTextChanged( e );
|
||||
UpdateTextFromDocument();
|
||||
}
|
||||
|
||||
private void UpdateTextFromDocument()
|
||||
{
|
||||
if( _preventTextUpdate )
|
||||
return;
|
||||
|
||||
_preventDocumentUpdate = true;
|
||||
Text = TextFormatter.GetText( Document );
|
||||
_preventDocumentUpdate = false;
|
||||
}
|
||||
|
||||
private void UpdateDocumentFromText()
|
||||
{
|
||||
if( _preventDocumentUpdate )
|
||||
return;
|
||||
|
||||
_preventTextUpdate = true;
|
||||
TextFormatter.SetText( Document, Text );
|
||||
_preventTextUpdate = false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Clears the content of the RichTextBox.
|
||||
/// </summary>
|
||||
public void Clear()
|
||||
{
|
||||
Document.Blocks.Clear();
|
||||
}
|
||||
|
||||
public override void BeginInit()
|
||||
{
|
||||
base.BeginInit();
|
||||
// Do not update anything while initializing. See EndInit
|
||||
_preventTextUpdate = true;
|
||||
_preventDocumentUpdate = true;
|
||||
}
|
||||
|
||||
public override void EndInit()
|
||||
{
|
||||
base.EndInit();
|
||||
_preventTextUpdate = false;
|
||||
_preventDocumentUpdate = false;
|
||||
// Possible conflict here if the user specifies
|
||||
// the document AND the text at the same time
|
||||
// in XAML. Text has priority.
|
||||
if( !string.IsNullOrEmpty( Text ) )
|
||||
UpdateDocumentFromText();
|
||||
else
|
||||
UpdateTextFromDocument();
|
||||
}
|
||||
|
||||
#endregion //Methods
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user