首页 > 解决方案 > VSTO:自动更正添加条目未按预期工作

问题描述

似乎我们在 VSTO for Word 上发现了一个错误。

使用该AutoCorrect.Entries.Add方法添加新条目时,这些条目只是添加到内存中,并且仅在 Word 关闭或处置时才提交到字典文件。

问题是,在 Word 的同一个实例中向多种语言添加一个或多个条目时,只有最后一种语言被提交到字典文件中。

这是代码示例:

        using var wordApplication = new ApplicationClass();
        foreach (var languageId in languageIds)
        {
            var wordDoc = wordApplication.Documents.Add();
            wordDoc.Range().InsertAfter("Text");
            wordDoc.Range().LanguageID = languageId;
            foreach (var entry in addedEntries)
            {
                wordApplication.AutoCorrect.Entries.Add(entry.Item1, entry.Item2);
            }
            wordDoc.Close(false);
        }

我们已经尝试过这个简化版本,但结果是一样的:

            using var wordApplication = new ApplicationClass();
            foreach (var languageId in languageIds)
            {
                wordApplication.ActiveDocument.Content.LanguageID = languageId
                foreach (var entry in addedEntries)
                {
                    wordApplication.AutoCorrect.Entries.Add(entry.Item1, entry.Item2);
                }
            }

在调试这两个代码示例时,我们可以看到其中word application.AutoCorrect.Entries包含我们正在循环的每种语言的新条目,但是当 Word 在循环结束时关闭时,只有最后一种语言被提交到磁盘,其他字典没有被修改,并且条目丢失。

通过在机器上实际打开 Word,我们可以确认只有最后一种语言包含自动更正条目,而另一种则没有。

标签: c#ms-wordvstoautocorrect

解决方案


那是因为您LanguageID在代码中的同一个 Range 实例上设置了属性:

foreach (var languageId in languageIds)
{
   wordApplication.ActiveDocument.Content.LanguageID = languageId
   ' ...
}

相反,请尝试设置LanguageID不同的范围并按以下方式使用自定义字典:

ActiveDocument.Paragraphs(2).Range.LanguageID = wdFrench 
Set myDictionary = CustomDictionaries.Add(Filename:="French.dic") 
With myDictionary 
 .LanguageSpecific = True 
 .LanguageID = wdFrench 
End With

推荐阅读