WPF 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)

阿列克谢-检查Codidact

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

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

根据此处提供的解决方案,我能够使其工作:

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">

[编辑]

我还尝试通过定义计时器并不时进行拼写检查来避免为每个文本更改应用属性值。在我的计算机上,使用最长的Wikipedia文章内容时看不到差异

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);
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在WPF RichTextBox中将特定文本设置为粗体

来自分类Dev

在WPF RichTextBox中的文本范围上设置工具提示

来自分类Dev

WPF:自动展开RichTextBox

来自分类Dev

WPF的RichTextBox替代

来自分类Dev

在RichTextBox WPF中添加图像

来自分类Dev

WPF的RichTextBox替代品

来自分类Dev

WPF MaterialDesign SolidColorBrush值冲突

来自分类Dev

如何在WPF C#中的richtextbox中设置文本的行距?

来自分类Dev

如何在WPF C#中的richtextbox中设置文本的行距?

来自分类Dev

WPF设置部署项目

来自分类Dev

WPF:支持多种语言

来自分类Dev

WPF Richtextbox中某个文本的位置

来自分类Dev

WPF将文本替换为RichTextBox

来自分类Dev

WinForms应用程序中的WPF RichTextBox

来自分类Dev

WPF RichTextBox增加网格行大小

来自分类Dev

WPF RichTextBox RTF更新文本?

来自分类Dev

WPF:RichTextBox选择样式属性被重置

来自分类Dev

WPF Richtextbox中某个文本的位置

来自分类Dev

WPF RichTextBox插入图像和撤消操作

来自分类Dev

如何加载WPF FormattedText对象(从RTF或RichTextBox)

来自分类Dev

WPF- Richtextbox fontsize缩放系数?

来自分类Dev

RichTextBox单击事件中的WPF超链接

来自分类Dev

WPF - 如何关闭在 RichTextBox 中打开的文件

来自分类Dev

WPF UI冻结-UI线程冲突?

来自分类Dev

设置WPF用户控件的样式

来自分类Dev

在WPF中设置样式TargetType

来自分类Dev

WPF设置父级(窗口)

来自分类Dev

WPF样式设置器Inputbindings

来自分类Dev

尺寸易于设置的屏幕WPF