Внедрение редактора word 2010 в приложение wpf

#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.