2016-05-16 45 views
6

我在我的WinForm應用程序中使用WPF TextBoxes進行拼寫檢查。每次我創建一個時,我都會像CustomDictionary一樣加載相同的文件。直到最近一切都很好。現在,他們需要很長時間才能加載,最多一秒鐘。一些表格有30或更多,意味着延遲將近半分鐘。這似乎是Windows 10(不是我最初發布的Windows 8)的情況。該應用程序運行在DotNet 4.0下,我試過4.5和4.6(不是4.61),所有版本都很慢。用文本框和自定義詞典拼寫在C#中減慢我的應用程序WPF

我看過sfaust的問題Spell check textbox in Win10 - Slow和am7zd的回答。由於這些,我查看了HKEY_CURRENT_USER \ Software \ Microsoft \ Spelling \ Dictionaries中的GLOBAL註冊表項。我有580個條目(在刪除沒有匹配文件的條目之後)並且仍然很慢。

目前,每次我創建一個文本框,並添加自定義詞典給它一個新條目似乎_GLOBAL_

  • 將產生是否有這樣做的東西不是加載自定義詞典的一個更好的辦法每次從文件中刪除?
  • 是否有一種方法可以在每次重新使用_GLOBAL_中的相同條目而不是創建新條目?
  • 當關閉應用程序(或重新啓動應用程序)時,是否有清除方式清除我的應用程序創建的GLOBAL及其匹配的.dic文件?
  • 我可以在每次啓動我的應用程序時完全清除_GLOBAL_。這帶來了我想要的速度,但缺點是什麼?

任何建議感激地收到。

回答

3

從別人沒有答案,所以這是我做了什麼:

  1. 我確信我關閉他們在表格前使用CustomDictionaries.Remove與自定義詞典的所有文本框。這會刪除_GLOBAL_中的新條目以及AppData \ Local \ Temp中的相關文件。

但會有時候出問題或用戶只需結束任務,留下_GLOBAL_條目和.DIC文件到位,所以:

  • 我決定進一步採取措施。當我啓動我的應用程序時,我不僅會清除_GLOBAL_中沒有匹配文件的條目(如上面引用的上一篇文章中所建議的那樣),還會刪除AppData \ Local \ Temp中引用.dic文件的所有條目。我的理論是,任何人在那裏都沒有留下條目,否則他們可能會將.dic文件保存在不同的文件夾中(如Microsoft Office)。

    try 
        { 
    
         string[] allDictionaries = (string[])Registry.GetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Spelling\Dictionaries", "_Global_", new string[0]); 
    
         if (allDictionaries.Count() > 0) 
         { 
          List<string> realDictionaries = new List<string>(); 
          bool changedSomething = false; 
    
          foreach (string thisD in allDictionaries) 
          { 
           if (File.Exists(thisD)) 
           { 
            if (thisD.Contains(@"\AppData\Local\Temp\")) 
            { 
             // Assuming that anyone who wants to keep a permanent .dic file will not store it in \AppData\Local\Temp 
             // So delete the file and don't copy the name of the dictionary into the list of good dictionaries. 
             File.Delete(thisD); 
             changedSomething = true; 
            } 
            else 
            { 
             realDictionaries.Add(thisD); 
            } 
           } 
           else 
           { 
            // File does not exist, so don't copy the name of the dictionary into the list of good dictionaries. 
            changedSomething = true; 
           } 
          } 
    
          if (changedSomething) 
          { 
           Registry.SetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Spelling\Dictionaries", "_Global_", realDictionaries.ToArray()); 
          } 
         } 
        } 
        catch (Exception ex) 
        { 
         MessageBox.Show(this, "Error clearing up old dictionary files.\n\nFull message:\n\n" + ex.Message, "Unable to delete file", MessageBoxButtons.OK, MessageBoxIcon.Warning); 
        } 
    
  • 我仍然想知道如果這是完全安全的清除_GLOBAL_引用文件中的應用程序數據\本地的\ Temp項。當然,人們不應該把重要的東西留在臨時文件夾中......他們應該嗎?

    如果CustomDictionaries.Add超載,允許我們設置.dic文件的名稱和文件夾,允許同一個應用程序中的所有文本框共享相同的內容,那真的不錯。dic文件,並確保我們不會留下多餘的條目和文件,而且看起來隨機的名字一開始就在附近......請微軟。

    +0

    真的很好解釋隊友。我現在面臨着同樣的問題(win8工作得很好,但現在在win10中只在一些機器上工作slowww)。我想我會實施一個類似你的解決方法,但我只是想知道有多少副作用可能意味着刪除_Global_變量內容(例如失去MS Word拼寫錯誤功能?等) –

    +0

    單詞和(據我所知)所有Office產品在_GLOBAL_:C:\ Users \ yourusername \ AppData \ Roaming \ Microsoft \ Office \ 16.0 \ fbf00836 \ Proofing \ RoamingCustom.dic中使用單個條目。所以它不會通過清除AppData \ Local \ Temp中的條目來實現。我想知道是否只有使用Temp文件夾作爲.dic文件的自定義字典的DotNet程序,但一直未能找到任何關於此內容的文章。 – Michael

    相關問題