2011-02-19 3 views
5

WPF RichTextBox 내에서 간단한 서식 지정 명령을 허용하고 다른 서식 지정 명령을 허용하지 싶습니다.특정 형식의 서식이 WPF RichTextBox에 붙여지지 않도록하는 방법

사용자가 굵게 또는 기울임 꼴을 적용하고 글 머리 기호 또는 번호 매기기 목록을 사용할 수있는 도구 모음을 만들었습니다. (기본적으로 블로그 나 위키에 적합한 서식 지정 명령 만 지원합니다.)

사용자는 전경색과 배경색, 다른 종류의 텍스트를 삽입하는 잘라 내기/붙여 넣기 작업을 수행 할 수 있습니다. 허용되지 않은 서식. 이렇게하면 흰색 텍스트를 흰색 배경에 붙여 넣는 사용자와 같이 사용성 문제가 심할 수 있습니다.

이러한 고급 서식 기능을 해제 할 수있는 방법이 있습니까? 그렇지 않다면 붙여 넣기 작업을 가로 채고 내가 원하지 않는 포맷을 제거 할 수있는 방법이 있습니까?

답변

5

당신은 다음과 같이 붙여 넣기 작업을 가로 챌 수 있습니다

void AddPasteHandler() 
    { 
     DataObject.AddPastingHandler(richTextBox, new DataObjectPastingEventHandler(OnPaste)); 
    } 

    void OnPaste(object sender, DataObjectPastingEventArgs e) 
    { 
     if (!e.SourceDataObject.GetDataPresent(DataFormats.Rtf, true)) return; 
     var rtf = e.SourceDataObject.GetData(DataFormats.Rtf) as string; 
     // Change e.SourceDataObject to strip non-basic formatting... 
    } 

과 지저분한 부분은 포맷의 일부가 아닌 전부를 유지하고있다. rtf 변수는 타사 라이브러리를 사용하여 구문 분석하고, DOM과 유사한 패턴을 사용하여 트리를 탐색하며, 텍스트, 굵게 및 기울임 꼴로 새로운 RTF를 내보낼 수있는 RTF 형식의 문자열입니다. 그런 다음 e.SourceDataObject 또는 다른 여러 옵션으로 다시 밀어 넣으십시오 (아래 문서 참조). 당신이 원하는 경우

+0

것은 내가 검사하고 RTF 소스를 수정해야 할 것 두려워했다. 나는 이것이 지저분해질 것을 알 수있다. 고마워, 릭. 이것은 시작하기 위해 필요한 것입니다. – dthrasher

+0

@alldayremix WPF RichTextBox가 Windows 서식있는 텍스트 공용 컨트롤을 기반으로하지 않기 때문에 여기서는 작동하지 않을 것이라고 생각합니다. –

+0

와우, 나는 그 세부 사항을 완전히 놓쳤다. 나의 실수. 'PastingHandler'가 그 길입니다. – alldayremix

2

코드입니다 :

많은 RTF 파서 중 하나입니다

여기 PastingHandler 문서입니다 에 모든 붙여 넣은 내용의 서식 제거 (당신이 요청하지 무엇을하지만, 사람에게 유용 할 수있다) :

void OnPaste(object sender, DataObjectPastingEventArgs e) 
    { 
     if (!e.SourceDataObject.GetDataPresent(DataFormats.Rtf, true)) return; 
     var rtf = e.SourceDataObject.GetData(DataFormats.Rtf) as string; 

     FlowDocument document = new FlowDocument(); 
     document.SetValue(FlowDocument.TextAlignmentProperty, TextAlignment.Left); 

     TextRange content = new TextRange(document.ContentStart, document.ContentEnd); 

     if (content.CanLoad(DataFormats.Rtf) && string.IsNullOrEmpty(rtf) == false) 
     { 
      // If so then load it with RTF 
      byte[] valueArray = Encoding.ASCII.GetBytes(rtf); 
      using (MemoryStream stream = new MemoryStream(valueArray)) 
      { 
       content.Load(stream, DataFormats.Rtf); 
      } 
     } 

     DataObject d = new DataObject(); 
     d.SetData(DataFormats.Text, content.Text.Replace(Environment.NewLine, "\n")); 
     e.DataObject = d; 
    } 
} 
관련 문제