Встраивание редактора Word 2010 в приложение wpf - PullRequest
17 голосов
/ 01 июня 2011

Как использовать редактор слов в приложении WPF? Можно ли использовать хостинг Windows-форм только в WPF? Есть ли другой способ сделать это?

Я нашел AvalonEdit , но у него нет нужных мне функций. Поэтому, используя этот способ, моя проблема может быть не решена.

Также есть некоторые вещи для размещения элемента управления Windows Form в WPF, но это не могло быть моим ответом.

Я хочу понять, есть ли способ использовать редактор слов собственным способом в приложении wpf? Все ли API будут доступны в этом решении?

Заранее спасибо.

Ответы [ 2 ]

11 голосов
/ 23 июня 2011

Вы можете разместить MS Word (2007/2010 и, возможно, другие версии) из элемента управления WebBrowser, это работает в WinForms и должно работать в WPF. .NET API предоставляется для автоматизации Word, задокументировано здесь . Необходимые сборки взаимодействия поставляются с Office 2010, поэтому развертывание намного проще, чем в предыдущих версиях Office.

См. Эту статью поддержки Microsoft для получения дополнительной информации о размещении Word в элементе управления WebBrowser. На приведенном ниже снимке экрана показано приложение Word, встроенное в приложение Winforms.

enter image description here

Обратите внимание, что это работает надежно только для одного размещенного экземпляра 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; }
        }
    }
0 голосов
/ 02 июня 2011

Что ж, собственно Word технически не предназначен для размещения в другом приложении, будь то WPF, WINFORMS или что-то еще.

Вы МОЖЕТЕ использовать API-трюки (например, SetParent), чтобы переместить главное окно Word в размещенное окно WPF. Я делал это раньше, но это довольно сложный бизнес, и очень легко пропустить вещи, которые вызывают GPF (как в Word, так и в вашем приложении).

Есть ли какая-то причина, почему это должно быть "Word в вашем приложении"? Почему бы не написать небольшое слово addin, а затем запустить Word из вашего приложения, когда это необходимо. тогда надстройка может связываться с вашим приложением, или с вашей БД, или с чем угодно, из Word.

Пользователи могут посчитать, что в любом случае это более удобный подход.

...