2014-10-24 4 views

답변

9

... 마지막으로 다음 해결책을 찾았습니다. DependencyProperty RtfText를 사용하여 원래의 RichEditBox 컨트롤에서 상속 된 컨트롤을 만들었습니다.

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 = "재활용"에 이상한 행동