2015-12-23 32 views
11

"de-DE" (ya da "en-US" dışında bir ") kültür ayarına sahip bir bilgisayarda, yazım denetimi dili ayarlanmış olan bir yazım denetimi etkinleştirilmiş bir RichTextBox'a sahip olmak isterim. İngilizce ("en-US").WPF richtextbox'ın çakışan dil ayarları

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

Bu yazım denetimi sağlayan, daha ziyade "en-US" den "de-DE" kültürü ile kontrol eder. Aynı şey xml:lang="en-us" eklerken de geçerlidir. Ancak

,

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

doğru İngilizce yazım denetimi sağlayan, aynı zamanda Klavye düzeni için "en-us" değiştirir.

Sistemin klavye ayarına nasıl sahip olabilirim (örneğin "de-DE"), ancak RichTextBox'ın İngilizce olarak yazım denetimi nasıl yapılır?

(Potansiyel ilgili: Ben .NET Framework 4.5 kullanıyorum) Ben Bölgesel Ayarlar değişmiş olsa da, ben İngilizce dışındaki dil için değil aktif yazım denetleyicisi olabilir benim için sorununuzu ve çoğaltmak denedim

+0

(ama kesin bilmiyorum): the longest Wikipedia article content kullanırken benim bilgisayarda, farkı göremiyorum. Ve bu Windows 8 ve sonrası. Spekülasyonumu sürdürdüğümde, "en-US" dilini yüklediğinizde bir Alman bilgisayarında varsayılan olarak "ABD" klavyesine sahip olursunuz. Giriş dilini "en-ABD" olarak ayarlamak, klavyeyi "ABD" olarak değiştirecektir, ancak "ABD" klavyesini kaldırırsanız ve "Almanca" klavyesini "en-ABD" diline eklerseniz "Almanca" kalmasını sağlarsınız. msgstr "En-US" kullanarak yazım denetimi yaparken bile klavye. Windows-Space'e basarak dil ve klavyeler arasında geçiş yapabilirsiniz. –

cevap

4

ve bileşenler önce Konu kültürü başlatıldı edildi:

1) RichTextBox devral: çözümüne dayanan

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

here sağlanan, ben o iş yapmak başardı

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) sizin xaml kullanın

<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"> 

[değiştir]

Ben de tanımlayarak, her bir metin değişikliği için özellik değeri uygulanmasını önlemek için çalıştık

Bir zamanlayıcı ve zaman zaman her şeyi kontrol et. Eğer yazım denetimi etkinleştirmek için Windows bir dil yüklemek zorunda olduğunu inanıyorum

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

Teşekkür ederim, Alexei, bu işe yarıyor. Bununla birlikte, RichTextBox'a metin girişi görsel olarak yavaşlatır. Her değişiklikte (yani bir tuşa basıldığında) dil özelliklerinin uygulanmasının bir yolu var mı? –

+0

İçerik uzunluğunuzu belirtebilir misiniz? Başka bir yaklaşım daha ekledim ve sizin özel durumunuz için daha iyi olup olmadığını merak ediyorum. – Alexei

+0

Teşekkürler Alexei! Yavaş makinelere (:-() sahibiz, bu yüzden bazen bir sorundur.Ancak, bazı kullanıcılar yazım denetimi etkinleştirilmiş sürümünü test ettiler ve hiçbiri kötü performanstan şikayetçi olmadı, bu yüzden muhtemelen sadece sürümle uğraşacağım. Zamanlayıcı olmadan, tekrar teşekkürler! –