CreateRibbonExtensibilityObject

CreateRibbonExtensibilityObject

我正在开发VSTO插件,并希望根据Office产品的语言版本对其进行本地化。从理论上讲,这就是方法:

int lcid = Application.LanguageSettings.get_LanguageID(Office.MsoAppLanguageID.msoLanguageIDUI);
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lcid);


为此,我当然需要初始化Application。因此,我可以执行此代码的最早时间是在Startup事件处理程序中。但是,此时已经调用了CreateRibbonExtensibilityObject(),因此,至少我的自定义功能区选项卡的标题将以Windows语言显示,这可能会有所不同。
在功能区类中,我有一个onLoad事件的处理程序,在其中存储IRibbonUI的实例供以后使用。我可以将此实例移交给addin类,并让其在其上调用IRibbonUI.Invalidate()。但这似乎有点奇怪-创建一个色带只是为了使其在几微秒后失效。因此,我想知道-并在这里问-是否存在一种更优雅的方法来根据办公产品的语言版本定位vsto插件的功能区。

(我见过this similar question,但是在by this answer中提供的方法对我来说似乎更糟。)

最佳答案

您始终可以覆盖CreateRibbonExtensibilityObject方法,也可以覆盖某些其他AddInBase方法(BeginInit,Initialize等),以挂接到AddIn加载生命周期中的正确位置。
我已经覆盖了CreateRibbonExtensibilityObject,以确保在加载功能区之前运行初始化代码。我注意到CreateRibbonExtensibilityObjectStartup事件是在随机时间触发的。有时Startup首先发生-有时CreateRibbonExtensibilityObject首先触发。我必须手动同步两个事件,以确保在创建功能区之前执行任何初始化代码。如果首先触发CreateRibbonExtensibilityObject-尚未创建Application对象。
CreateRibbonExtensibility中尝试这种方法:

 Outlook.Application app = this.GetHostItem<Outlook.Application>(typeof(Outlook.Application), "Application");
 int lcid = app.LanguageSettings.get_LanguageID(Office.MsoAppLanguageID.msoLanguageIDUI);
 Thread.CurrentThread.CurrentUICulture = new CultureInfo(lcid);

这将为您检索对Application实例的引用-不管是否已将其加载到Initialize中。

08-26 18:19