#wpf #editor #ms-word #ms-office #avalonedit
#wpf #редактор #ms-word #ms-office #avalonedit
Вопрос:
Как мне использовать редактор word в приложении WPF? Возможно ли это с использованием Windows forms, размещенных только в WPF? Есть ли другой способ добиться этого?
Я нашел AvalonEdit, но в нем нет функций, которые мне нужны. Таким образом, используя этот способ, моя проблема может быть не решена.
Также есть некоторые материалы для размещения элемента управления Windows forms в WPF, но это не могло быть моим ответом.
Я хочу понять, есть ли способ использовать редактор word встроенным способом в приложении wpf? Будут ли все API доступны в этом решении?
Заранее спасибо.
Комментарии:
1. Я не думаю, что у .net есть очень хорошие возможности для размещения «объектов ole doumment»
2. Но как насчет пакета DSO Farmer от Microsoft, который мог бы размещать редактор word в приложении Windows forms. к сожалению, Microsoft удалила его с сайта msdn без какой-либо причины.
3. @Mostaga, DSO Farmer, возможно, пришлось самостоятельно кодировать множество Com-интерфейсов
Ответ №1:
Вы можете разместить MS Word (2007/2010 и, возможно, другие версии) из элемента управления WebBrowser, это работает в WinForms и должно работать и в WPF. Для автоматизации Word предоставляется .NET API, описанный здесь. Требуемые сборки взаимодействия поставляются с Office 2010, поэтому развертывание намного проще, чем в предыдущих версиях Office.
Смотрите эту статью службы поддержки Майкрософт для получения более подробной информации о размещении Word в элементе управления WebBrowser. На скриншоте ниже показан Word, внедренный в основное приложение Winforms.
Обратите внимание, что это надежно работает только для одного размещенного экземпляра Word, поэтому вы не можете отображать два документа Word рядом в одном приложении. Кроме того, лента иногда может отсутствовать, но Word никогда не приводил к аварийному завершению работы приложения.
Для выполнения необходимых обновлений реестра требуются права администратора, поскольку существуют потенциальные проблемы с безопасностью. Одним из простых способов обновления реестра является написание сценария, но следующий (пересмотренный / непроверенный) код показывает, как это можно сделать на c # для Word, Excel и PowerPoint:
using System.Security.AccessControl;
private Dictionary<string,uint> OfficeBrowserRegKeys()
{
string[] officeRegKeyArray = new string[]
{
@"SOFTWAREClassesWord.Document.12",
@"SOFTWAREClassesWord.DocumentMacroEnabled.12",
@"SOFTWAREClassesExcel.Sheet.12",
@"SOFTWAREClassesExcel.SheetMacroEnabled.12",
@"SOFTWAREClassesExcel.SheetBinaryMacroEnabled.12",
@"SOFTWAREClassesPowerPoint.Show.12",
@"SOFTWAREClassesPowerPoint.ShowMacroEnabled.12",
@"SOFTWAREClassesPowerPoint.SlideShow.12",
@"SOFTWAREClassesPowerPoint.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; }
}
}
Комментарии:
1. Большое спасибо @pgfearo. Решение примерно такое, какое я ищу, но на самом деле я хочу разместить только редактор word, без управления его лентой. На самом деле, решение для размещения вашего веб-браузера не предоставляет мне необходимого контроля над самим редактором. Используя этот способ, у меня будут проблемы с управлением функциями редактора низкого уровня, например, с полями страницы или с получением закладок в редакторе. Как вы работаете с Word в своем приложении, @pgfearo? заранее спасибо.
2. @Мостафа Резаи. Да, вышеуказанное используется только как средство просмотра документов в моем приложении. Вы получаете гораздо больше контроля, фактически размещая свое приложение в Word в качестве COM-дополнения, я сделал это в другом концептуальном проекте — project video . [Документация Microsoft] ( msdn.microsoft.com/en-us/vsto/dd164295.aspx ) подробно описывает этот подход с использованием Visual Studio 2010.
Ответ №2:
Ну, собственно Word технически не предназначен для размещения в другом приложении, будь то WPF, WINFORMS или что-либо еще.
Вы МОЖЕТЕ использовать приемы api (например, SetParent), чтобы переместить главное окно Word в окно, размещенное в WPF. Я делал это раньше, но это довольно сложное дело, и очень легко пропустить вещи, которые вызывают GPFS (как в Word, так и в вашем приложении).
Есть ли какая-либо причина, по которой это должно быть «Word в вашем приложении»? Почему бы не написать небольшое дополнение word, а затем при необходимости запустить Word из своего приложения. затем надстройка может взаимодействовать с вашим приложением, или вашей базой данных, или чем-либо еще по мере необходимости из Word.
Пользователи могут счесть такой подход более удобным в любом случае.
Комментарии:
1. Word разработан для размещения в других приложениях, например Outlook, с использованием OLE
2. Мое приложение использует формат open xml для поддержки текста, я подумал, что, возможно, лучшим решением могло бы быть использование редактора Word для создания этого текста. но мне нужен некоторый контроль над редактором, например, выделенный жирным шрифтом текст и т.д. Я поискал в Интернете и обнаружил, что при использовании DSO Farmer hosting существует больше возможностей для управления редактором. Я не смог найти фермера DSO…
3. Я сделал это с помощью DSO framer, но у него было бы много нерешенных проблем. Может быть, лучше написать дополнение word.
4. @Ian, на самом деле, использование Outlook Word в качестве редактора электронной почты оказалось настолько обременительным и проблематичным, что MSOffice 2010 полностью от него отказался. Редактор Outlook теперь представляет собой очень урезанную версию word, полностью отделенную от самого WinWord.