Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 拼写检查不需要';不能使用WPF RichTextBox_C#_Wpf_Textbox_Richtextbox_Spell Checking - Fatal编程技术网

C# 拼写检查不需要';不能使用WPF RichTextBox

C# 拼写检查不需要';不能使用WPF RichTextBox,c#,wpf,textbox,richtextbox,spell-checking,C#,Wpf,Textbox,Richtextbox,Spell Checking,我正在尝试在WPF RichTextBox中启用拼写检查。 MSDN写入可用于启用TextBox和RichTextBox控件的拼写检查 不幸的是,以下代码不适用于我: <RichTextBox SpellCheck.IsEnabled="True" xml:lang="en-US"></RichTextBox> 但不幸的是,如果我尝试输入其他文本,它将被忽略。在编辑的内容上,属性Language似乎未设置为英语。我试图设置线程的CurrentCulture和Curren

我正在尝试在WPF RichTextBox中启用拼写检查。 MSDN写入可用于启用TextBox和RichTextBox控件的拼写检查

不幸的是,以下代码不适用于我:

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

但不幸的是,如果我尝试输入其他文本,它将被忽略。在编辑的内容上,属性
Language
似乎未设置为英语。我试图设置
线程的
CurrentCulture
CurrentUICulture
,但没有结果…

好的,我终于找到了问题的解决方案。如果深入研究WPF源代码,问题很容易被发现:有一个名为
TextEditorTyping
的内部类,它有一个名为
dotemiput
的方法,负责插入用户输入字符。此方法通过在
TextEditor
上调用
SetSelectedText
TextEditor
是另一个为各种控件提供文本编辑服务的内部类,如
RichTextBox
)来设置插入范围的区域性属性。下面是
dotemiput
方法的一部分:

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;
}
因此,该方法使用的是与Windows中当前输入语言对应的
InputLanguageManager.Current.CurrentInputLanguage
。如果使用的输入语言不同于英语(这是的默认值),则如果编辑RichTextBox中的文本,则FlowDocument中插入的元素将使用当前输入语言作为其
语言
属性。例如,如果您的输入语言是匈牙利语(
hu-hu
),则您的流程文档如下所示:

<FlowDocument>
     <Paragraph>
         <Run xml:lang="hu-hu">asdfasdf</Run>
     </Paragraph>
</FlowDocument>
这是一个在最后一行被释放的更改块-在它被释放后,将触发
TextContainerChanged
事件,我们可以通过覆盖
RichTextBox
OnTextChanged
方法来处理该事件:

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);
}
在这里,我们将编辑范围的语言重置为正确的值-to
Document.Language
。 在此解决方法之后,您可以使用WPF拼写检查-例如,法语:

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


它将神奇地工作。:)

它对我来说很好。你能给我一些关于你在什么环境下测试的提示吗?OS版本、.NET framework版本等…这不是有效的FlowDocument,并为我抛出语法错误。第一级元素必须从块中驱动,而不能运行。尝试一个有效的第一级元素,例如段落。是的,你说得对,我已经编辑了我的问题。将代码复制粘贴到StackOverflow post后,段落部分不知何故丢失了。
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);
}
<My:CultureIndependentRichTextBox xml:lang="fr-FR" SpellCheck.IsEnabled="True">
     <FlowDocument>
     </FlowDocument>
</My:CultureIndependentRichTextBox>