Подтвердить что ты не робот

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

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

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

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

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

Спасибо заранее.

4b9b3361

Ответ 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; }
        }
    }