2015-12-23 12 views
11

Su un computer con impostazioni cultura "de-DE" (o qualsiasi altro che "en-US"), mi piacerebbe avere un RichTextBox con controllo ortografico abilitato, con la lingua selezionata impostata su Inglese ("en-US").impostazioni della lingua in conflitto di Richtextbox WPF

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

In questo modo il controllo ortografico, ma i controlli con la cultura "de-DE", piuttosto che "it-IT". Lo stesso vale quando si aggiunge xml:lang="en-us".

Tuttavia,

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

consente correttamente il controllo ortografico in inglese, ma cambia anche il layout di tastiera a "it-IT".

Come posso avere l'impostazione della tastiera del sistema (nel mio caso "de-DE"), ma il controllo ortografico di RichTextBox è in inglese?

(potenzialmente rilevanti: sto usando .NET Framework 4.5)

+0

credo (ma non so per certo) che è necessario installare una lingua in Windows per abilitare il controllo ortografico. E questo è da Windows 8 e oltre. Continuando a speculare, su un computer tedesco quando installi la lingua "en-US", per impostazione predefinita ottieni la tastiera "US". Impostando la lingua di input su "en-US", la tastiera cambierà in "US", tuttavia, se rimuovi la tastiera "US" e aggiungi la tastiera "Tedesco" alla lingua "en-US", manterrai la "German" "tastiera anche quando si esegue il controllo ortografico utilizzando" en-US ". È possibile ruotare attraverso le lingue e le tastiere premendo Windows-Space. –

risposta

4

ho cercato di riprodurre il problema e per me non ho potuto attiva correttore ortografico per la lingua diversa dall'inglese, anche se ho cambiato Impostazioni internazionali e cultura Discussione prima che i componenti sono stati inizializzato:

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("de-DE"); 
    Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("de-DE"); 

sulla base di soluzione fornita here, sono stato in grado di farlo funzionare:

1) ereditano da 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) utilizzare nel vostro 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"> 

[modifica]

Ho anche cercato di evitare di applicare il valore della proprietà per ogni modifica del testo, attraverso la definizione di un timer e un incantesimo che controllano ogni tanto di tanto in tanto. Sul mio computer, non riesco a vedere la differenza quando si utilizza 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); 
    } 
} 
+0

Grazie, Alexei, sembra funzionare. Tuttavia, rende l'input di testo in RichTextBox visibilmente lento. C'è un modo per non eseguire l'applicazione della proprietà della lingua per ogni modifica (ad esempio, premere una chiave), ma forse solo dopo ogni parola inserita? –

+0

Puoi specificare la lunghezza del contenuto? Ho appena aggiunto un altro approccio e mi chiedo se è meglio per il tuo caso particolare. – Alexei

+0

Grazie Alexei! Abbiamo macchine lente (:-(), quindi a volte è effettivamente un problema, ma alcuni utenti hanno provato la versione con controllo ortografico e nessuno di loro si è lamentato delle cattive prestazioni. senza il timer, grazie ancora! –

Problemi correlati