c# - WPF 富文本框的冲突语言设置

标签 c# .net wpf windows richtextbox

在文化设置为“de-DE”(或除“en-US”之外的任何其他语言)的计算机上,我想要一个启用拼写检查的 RichTextBox,并将检查的语言设置为英语(“en-US” ").

<RichTextBox SpellCheck.IsEnabled="True" Language="en-US"/>

这会启用拼写检查,但会检查“de-DE”文化,而不是“en-US”。添加 xml:lang="en-us" 时也是如此。

但是,

<RichTextBox SpellCheck.IsEnabled="True" InputLanguageManager.InputLanguage="en-US"/>

正确启用英文拼写检查,但也将键盘布局更改为“en-US”。

如何让系统的键盘设置(在我的例子中为“de-DE”),但 RichTextBox 的拼写检查为英语?

(可能相关:我正在使用 .NET Framework 4.5)

最佳答案

我已尝试重现您的问题,但对我而言,我无法为英语以外的其他语言激活拼写检查器,尽管我在组件初始化之前更改了区域设置和线程区域性:

    Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("de-DE");
    Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("de-DE");

基于提供的解决方案 here ,我能够让它工作:

1)继承自RichTextBox:

class RichTextBoxEx : RichTextBox
{
    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);
    }
}

2) 在你的 xaml 中使用它

<local:RichTextBoxEx x:Name="richTextBox" HorizontalAlignment="Left" Height="100" Margin="33,100,0,0" VerticalAlignment="Top" Width="474" 
             xml:lang="de-DE" SpellCheck.IsEnabled="True">

[编辑]

我还尝试通过定义一个计时器并不时检查所有内容来避免为每次文本更改应用属性值。在我的电脑上,使用 the longest Wikipedia article content 时我看不出有什么不同。 :

class RichTextBoxEx : RichTextBox
{
    DispatcherTimer timer;
    bool textChanged = false;

    public RichTextBoxEx()
    {
        if (DesignerProperties.GetIsInDesignMode(this))
            return;

        timer = new DispatcherTimer();
        timer.Interval = new TimeSpan(0, 0, 1);
        timer.Tick += timer_Tick;
        timer.Start();
    }

    void timer_Tick(object sender, EventArgs e)
    {
        try
        {
            var range = new TextRange(Document.ContentStart, Document.ContentEnd);
            range.ApplyPropertyValue(FrameworkElement.LanguageProperty, Document.Language);
        }
        finally
        {
            textChanged = false;
        }
    }

    protected override void OnTextChanged(TextChangedEventArgs e)
    {
        // TODO: remove if timer version works correctly
        //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);
        //        }
        //    }
        //}

        textChanged = true;
        base.OnTextChanged(e);
    }
}

关于c# - WPF 富文本框的冲突语言设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34434955/

相关文章:

c# - 工作单元测试的单元测试失败

c# - 将 IHttpClientFactory 传递给 .NET Standard 类库

c# - Xml 文档 - 参数上的 <see> 标记

C# MVVM 如何动态创建 View

c# - 如何在使用模拟命令行循环的 API 时重定向 CLIPS 输入和输出?

c# - 具有 OneWayToSource 绑定(bind)的 SelectedIndex 不会触发

c# - 使用特定接口(interface)时的 MEF 组合导入问题

.net - 是否需要 "close".net 配置

c# - 如何获取列表的名称

c# - 根据范围数据查找值