2015-12-23 7 views
11

Auf einem Computer mit Kultur Einstellung "de-DE" (oder eine andere als "en-US"), möchte ich eine RichTextBox mit Rechtschreibprüfung aktiviert haben, mit der aktivierten Sprache eingestellt Englisch ("en-US").widersprüchliche Spracheinstellungen von WPF richttextbox

<RichTextBox SpellCheck.IsEnabled="True" Language="en-US"/> 

Dies ermöglicht die Rechtschreibprüfung, aber Kontrollen mit "de-DE" Kultur, sondern als "en-US". Das gleiche gilt, wenn Sie xml:lang="en-us" hinzufügen.

jedoch

<RichTextBox SpellCheck.IsEnabled="True" InputLanguageManager.InputLanguage="en-US"/> 

ermöglicht richtig Zauber auf Englisch Überprüfung, sondern ändert sich auch das Tastaturlayout "en-US".

Wie kann ich die Tastatureinstellung des Systems haben (in meinem Fall "de-DE"), aber die Rechtschreibprüfung der RichTextBox ist Englisch?

(potentiell relevant: Ich bin mit .NET Framework 4.5)

+0

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. –

Antwort

4

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

Danke, Alexei, das scheint zu funktionieren. Es macht jedoch Texteingabe in die RichTextBox sichtbar langsam. Gibt es eine Möglichkeit, die Spracheigenschaft nicht bei jeder Änderung (d. H. Tastendruck) anzuwenden, sondern vielleicht nur nach jedem eingegebenen Wort? –

+0

Können Sie bitte Ihre Inhaltslänge angeben? Ich habe gerade einen anderen Ansatz hinzugefügt und ich frage mich, ob es für Ihren speziellen Fall besser ist. – Alexei

+0

Danke Alexei! Wir haben langsame Maschinen (:-(), also ist es manchmal ein Problem. Allerdings habe ich einige Benutzer die Rechtschreibprüfung Version getestet und keiner von ihnen beschwert sich über schlechte Leistung. Also werde ich wahrscheinlich nur mit der Version bleiben ohne den Timer, danke nochmal! –

Verwandte Themen