您可以在 WebBrowser 控件中托管 MS Word(2007/2010 和可能的其他版本),这适用于 WinForms,也应该适用于 WPF。为自动化 Word 提供了 .NET API,记录在 here。所需的互操作程序集随 Office 2010 一起提供,因此部署比以前的 Office 版本简单得多。
有关在 WebBrowser 控件中托管 Word 的更多详细信息,请参阅此Microsoft Support article。下面的屏幕截图显示了嵌入在主机 Winforms 应用程序中的 Word。
请注意,这只适用于 Word 的单个托管实例,因此您不能在同一应用程序中并排显示 2 个 Word 文档。此外,功能区有时会丢失 - 但 Word 从未导致应用程序崩溃。
需要管理员权限才能进行所需的注册表更新,因为存在潜在的安全问题。进行注册表更新的一种简单方法是编写脚本,但以下(修订/未经测试)代码显示了如何在 c# 中为 Word、Excel 和 PowerPoint 完成此操作:
using System.Security.AccessControl;
private Dictionary<string,uint> OfficeBrowserRegKeys()
{
string[] officeRegKeyArray = new string[]
{
@"SOFTWARE\Classes\Word.Document.12",
@"SOFTWARE\Classes\Word.DocumentMacroEnabled.12",
@"SOFTWARE\Classes\Excel.Sheet.12",
@"SOFTWARE\Classes\Excel.SheetMacroEnabled.12",
@"SOFTWARE\Classes\Excel.SheetBinaryMacroEnabled.12",
@"SOFTWARE\Classes\PowerPoint.Show.12",
@"SOFTWARE\Classes\PowerPoint.ShowMacroEnabled.12",
@"SOFTWARE\Classes\PowerPoint.SlideShow.12",
@"SOFTWARE\Classes\PowerPoint.SlideShowMacroEnabled.12"
};
Dictionary<string,uint> officeRegKeys = new Dictionary<string, uint>();
uint wrdVal = 0x80000024;
uint excelVal = 0x80000A00;
uint powerPtVal = 0x800000A0;
foreach(string keyName in officeRegKeyArray)
{
if (keyName.Contains("Word"))
{
officeRegKeys.Add(keyName, wrdVal);
}
else if (keyName.Contains("Excel"))
{
officeRegKeys.Add(keyName, excelVal);
}
else
{
officeRegKeys.Add(keyName, powerPtVal);
}
}
return officeRegKeys;
}
private void setNewOfficeKeys()
{
uint editFlag = 0x00010000;
Dictionary<string,uint> officeRegKeys = OfficeBrowserRegKeys();
foreach (KeyValuePair<string, uint> kvp in officeRegKeys)
{
try
{
RegistryKey rKey = Registry.LocalMachine.OpenSubKey(kvp.Key,
RegistryKeyPermissionCheck.ReadWriteSubTree,
System.Security.AccessControl.RegistryRights.SetValue);
rKey.SetValue("BrowserFlags", unchecked((int)kvp.Value),
RegistryValueKind.DWord);
rKey.SetValue("EditFlags", unchecked((int)editFlag),
RegistryValueKind.DWord);
}
catch (Exception e) { string msg = e.Message; }
}
}