2013-09-24 2 views
2

WPF RichTextBox에서 맞춤법 검사를 사용하려고합니다. MSDN은 System.Windows.Controls.SpellCheck을 사용하여 TextBox 및 RichTextBox 컨트롤의 맞춤법 검사를 사용하도록 설정할 수 있습니다. 불행하게도WPF RichTextBox에서 맞춤법 검사가 작동하지 않습니다.

, 다음 코드는 나를 위해 작동하지 않습니다 내가 미스, 만약 내가 일반 텍스트 상자를 사용하는 경우, 그것은 완벽하게 정상적으로 작동하기 때문에, 이상하다

<RichTextBox SpellCheck.IsEnabled="True" xml:lang="en-US"></RichTextBox> 

가 (필자는 레드 라인을 볼 수 있습니다 철자법).

불행하게도, everyanswer는 난 단지 TrueSpellCheck.IsEnabled을 설정 언급하고 지원되는 언어 중 하나에 Language 속성을 설정 SO 지금까지 발견했지만, 나는 왜 내 컴퓨터에이 방법이 작동하지 않습니다 아무 생각이 없다 내장 RichTextBoxes의 경우?

업데이트 :

<RichTextBox SpellCheck.IsEnabled="True"> 
    <FlowDocument Language="en"> 
     <Paragraph> 
      <Run>asdfasdf</Run> 
     </Paragraph> 
    </FlowDocument> 
</RichTextBox> 

을하지만 다른 텍스트를 입력하려고하면 불행하게도,이 무시됩니다

내가, 실행의 텍스트에 밑줄이 될 것이라고 작성하는 경우. 수정 된 콘텐츠에서 Language 속성이 영어로 설정되지 않은 것으로 보입니다. Thread'sCurrentCultureCurrentUICulture도 아무런 결과없이 설정하려고 시도했습니다 ...

+1

그것은 나를 위해 잘 작동합니다. – Paparazzi

+0

어떤 환경에서 테스트합니까? OS 버전, .NET 프레임 워크 버전 등 ... – Zsolt

+0

유효한 FlowDocument가 아니며 구문 오류가 발생합니다. 첫 번째 레벨 요소는 블록에서 실행해야하며 실행은 그렇지 않습니다. 단락과 같은 유효한 첫 번째 레벨 요소를 사용해보십시오. – Paparazzi

답변

3

좋아, 마지막으로 문제의 해결 방법을 알아 냈습니다. 이 문제는 WPF 소스를 파헤쳐 보면 쉽게 알 수 있습니다. TextEditorTyping이라는 내부 클래스에 DoTextInput이라는 메서드가있어 사용자 입력 문자를 삽입하는 데 사용됩니다. 이 메서드는 TextEditorSetSelectedText을 호출하여 삽입 된 범위의 culture 속성을 설정합니다. TextEditorRichTextBox과 같은 다양한 컨트롤에 텍스트 편집 서비스를 제공하는 또 다른 내부 클래스입니다.

IDisposable disposable = This.Selection.DeclareChangeBlock(); 
using (disposable) 
{ 
    ITextSelection selection = This.Selection; 
    if (!This.AllowOvertype || !This._OvertypeMode) 
    { 
     flag = false; 
    } 
    else 
    { 
     flag = str != "\t"; 
    } 
    ((ITextRange)selection).ApplyTypingHeuristics(flag); 
    // SETTING THE CULTURE -> 
    This.SetSelectedText(str, InputLanguageManager.Current.CurrentInputLanguage); 
    ITextPointer textPointer = This.Selection.End.CreatePointer(LogicalDirection.Backward); 
    This.Selection.SetCaretToPosition(textPointer, LogicalDirection.Backward, true, true); 
    undoCloseAction = UndoCloseAction.Commit; 
} 

따라서 상기 방법은 윈도우에서 현재 입력 언어에 해당하는 InputLanguageManager.Current.CurrentInputLanguage을 사용한다 : 여기서 DoTextInput 방법의 일부이다. RichTextBox의 텍스트를 편집하면 FlowDocument의 삽입 요소에 Language 속성으로 현재 입력 언어가 적용됩니다 (FrameworkElement.LanguageProperty의 기본값 인 영어 이외의 입력 언어를 사용하는 경우). 귀하의 입력 언어 (hu-hu) 헝가리어 경우 예를 들어, 당신 FlowDocument는 다음과 같이 보일 것이다 :

<FlowDocument> 
    <Paragraph> 
     <Run xml:lang="hu-hu">asdfasdf</Run> 
    </Paragraph> 
</FlowDocument> 

This site 같은 문제에 대해 설명합니다.

다행히도이 문제를 해결할 수있는 방법이 있습니다. 우리는 이미 DoTextInput 방법의 소스를 볼 수 있고, 그 내부에 사용하여 블록이 : 이것은 마지막 줄에 배치됩니다 변경 블록은

IDisposable disposable = This.Selection.DeclareChangeBlock(); 
using (disposable) 
{ 
    ... 
    // SETTING THE CULTURE -> 
    This.SetSelectedText(str, InputLanguageManager.Current.CurrentInputLanguage); 
    ... 
} 

-이 배치됩니다 후 TextContainerChanged 이벤트는이 - Document.Language으로하여 적절한 값으로 편집 범위의 언어를 재설정하는

protected override void OnTextChanged(TextChangedEventArgs e) 
{ 
    var changeList = e.Changes.ToList(); 
    if (changeList.Count > 0) 
    { 
     foreach (var change in changeList) 
     { 
      TextPointer start = null; 
      TextPointer end = null; 
      if (change.AddedLength > 0) 
      { 
       start = this.Document.ContentStart.GetPositionAtOffset(change.Offset); 
       end = this.Document.ContentStart.GetPositionAtOffset(change.Offset + change.AddedLength); 
      } 
      else 
      { 
       int startOffset = Math.Max(change.Offset - change.RemovedLength, 0); 
       start = this.Document.ContentStart.GetPositionAtOffset(startOffset); 
       end = this.Document.ContentStart.GetPositionAtOffset(change.Offset); 
      } 

      if (start != null && end != null) 
      { 
       var range = new TextRange(start, end); 
       range.ApplyPropertyValue(FrameworkElement.LanguageProperty, Document.Language); 
      } 
     } 
    } 
    base.OnTextChanged(e); 
} 

여기서 우리가 RichTextBoxOnTextChanged의 방법을 대체하여 처리 할 수있는 소성.

<My:CultureIndependentRichTextBox xml:lang="fr-FR" SpellCheck.IsEnabled="True"> 
    <FlowDocument> 
    </FlowDocument> 
</My:CultureIndependentRichTextBox> 

그리고 그것은 마법처럼 작동합니다 : 프랑스어로 - 예를 들어, 이 해결 한 후에는 WPF의 맞춤법 검사를 사용할 수 있습니다. :)

관련 문제