Ich habe versucht, das Problem zu reproduzieren, und für mich ich konnte nicht aktiv Rechtschreibprüfung für andere Sprache als Englisch, obwohl ich Regional-Einstellungen geändert haben und Themen-Kultur vor Komponenten initialisiert wurden:
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("de-DE");
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("de-DE");
Basierend auf Lösung here zur Verfügung gestellt, ich war in der Lage, damit es funktioniert:
1) Vererben von 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) Verwenden Sie in Ihrem 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">
[Bearbeiten]
Ich habe auch versucht, den Eigenschaftswert für jede Textänderung der Anwendung zu vermeiden, durch Definieren ein Timer und eine Rechtschreibprüfung von Zeit zu Zeit. Auf meinem Computer kann, sehe ich den Unterschied nicht, wenn the longest Wikipedia article content mit:
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);
}
}
Ich glaube (aber nicht wissen, sicher), dass Sie die Sprache in Windows installieren Rechtschreibprüfung zu aktivieren. Und das ist ab Windows 8 und höher. Fortsetzung meiner Spekulationen, auf einem deutschen Computer, wenn Sie die "en-US" Sprache installieren, erhalten Sie standardmäßig die "US" -Tastatur. Wenn Sie die Eingabesprache auf "en-US" stellen, wird die Tastatur auf "US" umgeschaltet. Wenn Sie jedoch die "US" -Tastatur entfernen und die "deutsche" Tastatur der "en-US" -Sprache hinzufügen, behalten Sie die "Deutsch "Tastatur auch bei Rechtschreibprüfung mit" en-US ". Sie können durch Drücken von Windows-Space durch Sprachen und Tastaturen drehen. –