Вы можете разместить MS Word (2007/2010 и, возможно, другие версии) из элемента управления WebBrowser, это работает в WinForms и должно работать в WPF. .NET API предоставляется для автоматизации Word, задокументировано здесь . Необходимые сборки взаимодействия поставляются с Office 2010, поэтому развертывание намного проще, чем в предыдущих версиях Office.
См. Эту статью поддержки Microsoft для получения дополнительной информации о размещении Word в элементе управления WebBrowser. На приведенном ниже снимке экрана показано приложение Word, встроенное в приложение Winforms.
Обратите внимание, что это работает надежно только для одного размещенного экземпляра 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; }
}
}