C# WPF richtextbox的语言设置冲突
在具有区域设置“de de”(或除“en-US”之外的任何其他)的计算机上,我希望有一个启用拼写检查的RichTextBox,检查的语言设置为英语(“en-US”) 正确启用英语拼写检查,但也将键盘布局更改为“en-US” 如何设置系统的键盘(在我的例子中是“de de”),但RichTextBox的拼写检查是英文的C# WPF richtextbox的语言设置冲突,c#,.net,wpf,windows,richtextbox,C#,.net,Wpf,Windows,Richtextbox,在具有区域设置“de de”(或除“en-US”之外的任何其他)的计算机上,我希望有一个启用拼写检查的RichTextBox,检查的语言设置为英语(“en-US”) 正确启用英语拼写检查,但也将键盘布局更改为“en-US” 如何设置系统的键盘(在我的例子中是“de de”),但RichTextBox的拼写检查是英文的 (可能相关:我使用的是.NET Framework 4.5)我试图重现您的问题,对我来说,我无法激活除英语以外的其他语言的拼写检查器,尽管我在初始化组件之前更改了区域设置和线程区域
(可能相关:我使用的是.NET Framework 4.5)我试图重现您的问题,对我来说,我无法激活除英语以外的其他语言的拼写检查器,尽管我在初始化组件之前更改了区域设置和线程区域性:
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">
也许有人会觉得这很有帮助 我也有同样的问题。我想在RichTextBox中为塞尔维亚语拉丁语和西里尔语文本添加拼写检查。为了让它工作,我必须为这两种语言安装Windows语言包。 之后,该代码使其工作:
Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.GetCultureInfo("sr-Cyrl"); // Change language name to what you need
richTextBox1.Language = XmlLanguage.GetLanguage(Thread.CurrentThread.CurrentCulture.Name);
对于德语、法语、意大利语等语言,我认为您不需要安装语言包,因为默认情况下已经安装了这些语言包,但对于其他语言,您必须安装。谢谢您,Alexei,这似乎可行。但是,它使文本输入到RichTextBox的速度明显变慢。是否有一种方法可以不在每次更改(即按键)时应用language属性,而可能仅在每个输入的单词之后才执行?您能否指定内容长度?我刚刚添加了另一种方法,我想知道它是否适合您的特殊情况。谢谢Alexei!我们的机器速度很慢(:-(),所以有时候这确实是个问题。但是,我让一些用户测试了启用拼写检查的版本,没有人抱怨性能不好。所以我可能会坚持使用没有计时器的版本。再次感谢!我相信(但不确定)您必须在Windows中安装一种语言才能启用拼写检查。这是从Windows 8及以后的版本开始的。继续我的推测,在德国计算机上安装“en-US”语言时,默认情况下您会获得“US”键盘。将输入语言设置为“en-US”会将键盘切换为“US”,但是,如果您删除“US”键盘,并将“德语”键盘添加到“en-US”语言中。即使使用“en-US”进行拼写检查,您也将保留“德语”键盘。按Windows空格键,您可以在各种语言和键盘之间旋转。
<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">
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);
}
}
Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.GetCultureInfo("sr-Cyrl"); // Change language name to what you need
richTextBox1.Language = XmlLanguage.GetLanguage(Thread.CurrentThread.CurrentCulture.Name);