在文化设置为“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/