2016-05-16 44 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

    相关问题