2014-10-24 9 views

ответ

9

... наконец, я нашел следующее решение. Я создал унаследованный элемент управления из исходного элемента управления RichEditBox с помощью параметра DependencyProperty RtfText.

public class RichEditBoxExtended : RichEditBox 
{ 
    public static readonly DependencyProperty RtfTextProperty = 
     DependencyProperty.Register(
     "RtfText", typeof (string), typeof (RichEditBoxExtended), 
     new PropertyMetadata(default(string), RtfTextPropertyChanged)); 

    private bool _lockChangeExecution; 

    public RichEditBoxExtended() 
    { 
     TextChanged += RichEditBoxExtended_TextChanged; 
    } 

    public string RtfText 
    { 
     get { return (string) GetValue(RtfTextProperty); } 
     set { SetValue(RtfTextProperty, value); } 
    } 

    private void RichEditBoxExtended_TextChanged(object sender, RoutedEventArgs e) 
    { 
     if (!_lockChangeExecution) 
     { 
      _lockChangeExecution = true; 
      string text; 
      Document.GetText(TextGetOptions.None, out text); 
      if (string.IsNullOrWhiteSpace(text)) 
      { 
       RtfText = ""; 
      } 
      else 
      { 
       Document.GetText(TextGetOptions.FormatRtf, out text); 
       RtfText = text; 
      } 
      _lockChangeExecution = false; 
     } 
    } 

    private static void RtfTextPropertyChanged(DependencyObject dependencyObject, 
     DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs) 
    { 
     var rtb = dependencyObject as RichEditBoxExtended; 
     if (rtb == null) return; 
     if (!rtb._lockChangeExecution) 
     { 
      rtb._lockChangeExecution = true; 
      rtb.Document.SetText(TextSetOptions.FormatRtf, rtb.RtfText); 
      rtb._lockChangeExecution = false; 
     } 
    } 
} 

Это решение работает для меня - возможно, для других. :-)

Известные проблемы: странные поведения в VirtualizingStackPanel.VirtualizationMode = "Recycling"

Смежные вопросы