좋아, 마지막으로 문제의 해결 방법을 알아 냈습니다. 이 문제는 WPF 소스를 파헤쳐 보면 쉽게 알 수 있습니다. TextEditorTyping
이라는 내부 클래스에 DoTextInput
이라는 메서드가있어 사용자 입력 문자를 삽입하는 데 사용됩니다. 이 메서드는 TextEditor
에 SetSelectedText
을 호출하여 삽입 된 범위의 culture 속성을 설정합니다. TextEditor
은 RichTextBox
과 같은 다양한 컨트롤에 텍스트 편집 서비스를 제공하는 또 다른 내부 클래스입니다.
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);
}
여기서 우리가 RichTextBox
OnTextChanged
의 방법을 대체하여 처리 할 수있는 소성.
<My:CultureIndependentRichTextBox xml:lang="fr-FR" SpellCheck.IsEnabled="True">
<FlowDocument>
</FlowDocument>
</My:CultureIndependentRichTextBox>
그리고 그것은 마법처럼 작동합니다 : 프랑스어로 - 예를 들어, 이 해결 한 후에는 WPF의 맞춤법 검사를 사용할 수 있습니다. :)
그것은 나를 위해 잘 작동합니다. – Paparazzi
어떤 환경에서 테스트합니까? OS 버전, .NET 프레임 워크 버전 등 ... – Zsolt
유효한 FlowDocument가 아니며 구문 오류가 발생합니다. 첫 번째 레벨 요소는 블록에서 실행해야하며 실행은 그렇지 않습니다. 단락과 같은 유효한 첫 번째 레벨 요소를 사용해보십시오. – Paparazzi