Вложение редактора слова 2010 в приложение wpf
Как использовать редактор слов в приложении WPF? Можно ли использовать только Windows Forms в WPF? Есть ли другой способ сделать это?
Я нашел AvalonEdit, но у меня нет функций, которые мне нужны. Поэтому, используя этот способ, моя проблема не может быть решена.
Также есть некоторые вещи, чтобы разместить элемент управления Windows Forms в WPF, но это не мог быть мой ответ.
Я хочу понять, что есть способ использовать редактор слов в родном стиле в приложении wpf?
Будут ли доступны все API-интерфейсы в этом решении?
Спасибо заранее.
Ответы
Ответ 1
Ну, собственно Word не технически разработан для размещения другим приложением, будь то WPF, WINFORMS или что-то еще.
Вы можете использовать api-трюки (например, SetParent) для перемещения окна Main Word в окно WPF. Я делал это раньше, но это довольно сложный бизнес, и очень легко пропустить то, что вызывает GPF (как в Word, так и в вашем приложении).
Есть ли причина, по которой это должно быть "Word в вашем приложении"? Почему бы не написать небольшое слово addin, а затем запустить Word из своего приложения, когда это необходимо. то Addin может связываться с вашим приложением, или с вашей БД, или по необходимости, из Word.
В любом случае пользователи могут найти более приемлемый подход.
Ответ 2
Вы можете размещать MS Word (2007/2010 и, возможно, другие версии) изнутри элемента управления WebBrowser, это работает в WinForms и также должно работать в WPF. API.NET предназначен для автоматизации Word, документально зарегистрированного здесь. Необходимые сборки interop поставляются с Office 2010, поэтому развертывание намного проще, чем предыдущие версии Office.
Подробнее о размещении Word в элементе управления WebBrowser см. в статье поддержки Microsoft. На скриншоте ниже показано Word, встроенное в приложение Winforms хоста.
![enter image description here]()
Обратите внимание, что это только надежно работает для одного размещенного экземпляра Word, поэтому вы не можете показывать документы Word 2 в одном приложении. Кроме того, лента иногда может отсутствовать, но Word никогда не приводил к сбою приложения.
Административные права необходимы для внесения необходимых обновлений реестра, поскольку существуют потенциальные проблемы безопасности. Один простой способ сделать обновления реестра - написать script, но следующий (пересмотренный/непроверенный) код показывает, как это можно сделать в С# для 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; }
}
}