微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

WPF richtextbox的冲突语言设置

在文化设置“德DE”(或任何非“EN – 美国”)的计算机上,我想有一个启用了拼写检查的RichTextBox与检查语言设置为英语(“EN – 美国”)。

<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”。

从Win32_PrintJob获取总页数

如何在不活动窗口中模拟代码中的键盘事件?

我怎样才能捕捉到另一个进程的未处理的exception?

为什么我的控制台应用程序有命令历史?

有没有办法来检查用户是否有特定的权利?

我怎样才能让系统的键盘设置(在我的情况下,“德DE”),但RichTextBox的拼写检查是英语?

(潜在的相关:我正在使用.NET Framework 4.5)

从windows服务中杀死一个进程

设置进程调度程序的框架

是否有可能知道哪个应用程序创build了一个文件

如何查找Windows文件夹中的项目是否真的对用户隐藏?

孤立的存储

我试图重现您的问题,对于我而言,我无法为除英语以外的其他语言启用拼写检查程序,但在组件初始化之前已经更改了“区域设置”和“线程文化”:

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" VerticalAlignment="Top" Width="474" xml:lang="de-DE" SpellCheck.IsEnabled="True">

[编辑]

我也试图通过定义一个定时器和拼写检查所有内容来避免为每个文本更改应用属性值。 在我的电脑上,当使用最长的维基百科文章内容时,我看不出有什么不同:

class RichTextBoxEx : RichTextBox { dispatcherTimer timer; bool textChanged = false; public RichTextBoxEx() { if (DesignerProperties.GetIsInDesignMode(this)) return; timer = new dispatcherTimer(); timer.Interval = new TimeSpan(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] 举报,一经查实,本站将立刻删除。

相关推荐