【问题标题】:Embedding word 2010 editor in a wpf application在 wpf 应用程序中嵌入 word 2010 编辑器
【发布时间】:2011-09-06 01:02:14
【问题描述】:

如何在 WPF 应用程序中使用文字编辑器?是否可以仅在 WPF 中使用 Windows 窗体托管?还有另一种方法可以实现吗?

我找到了AvalonEdit,但它没有我需要的功能。所以用这种方式,我的问题可能解决不了。

还有一些东西可以在 WPF 中托管 Windows 窗体控件,但这不是我的答案。

我想了解有没有办法在 wpf 应用程序中以本机方式使用文字编辑器? 该解决方案中的所有 API 都可用吗?

提前致谢。

【问题讨论】:

  • 我不认为 .net 对托管“ole doumment 对象”有很好的支持
  • 但是微软的 DSO Farmer 包可以在 Windows 窗体应用程序中托管文字编辑器。不幸的是,微软无缘无故地将它从 msdn 网站上删除了。
  • @Mostaga,DSO Farmer 可能不得不自己编写很多 Com 接口

标签: wpf editor ms-word ms-office avalonedit


【解决方案1】:

您可以在 WebBrowser 控件中托管 MS Word(2007/2010 和可能的其他版本),这适用于 WinForms,也应该适用于 WPF。为自动化 Word 提供了 .NET API,记录在 here。所需的互操作程序集随 Office 2010 一起提供,因此部署比以前的 Office 版本简单得多。

有关在 WebBrowser 控件中托管 Word 的更多详细信息,请参阅此Microsoft Support article。下面的屏幕截图显示了嵌入在主机 Winforms 应用程序中的 Word。

请注意,这只适用于 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; }
        }
    }

【讨论】:

  • 非常感谢@pgfearo。解决方案大致是我正在寻找的,但实际上我只想托管文字编辑器,没有它的功能区控件。事实上,您的网络浏览器托管解决方案并没有提供我对编辑器本身所需的控制。使用这种方式,我将无法控制低级编辑器功能,例如页边距或在编辑器上获取书签。您如何在应用程序中使用 Word,@pgfearo?提前致谢。
  • @Mostafa Rezaei。是的,以上仅在我的应用程序中用作文档查看器。在 Word 中作为 COM 插件托管您的应用程序时,您可以获得更多控制权,我在另一个概念项目 - project video 中做到了这一点。 [Microsoft 文档] (msdn.microsoft.com/en-us/vsto/dd164295.aspx) 使用 Visual Studio 2010 提供了有关此方法的详细信息。
【解决方案2】:

嗯,从技术上讲,Word 本身并不是为由另一个应用程序托管的,无论是 WPF、WINFORMS 还是其他任何应用程序。

您可以使用 api 技巧(如 SetParent)将 Main Word 窗口移动到 WPF 托管窗口中。我以前做过,但这是一件非常棘手的事情,而且很容易错过导致 GPF 的事情(在 Word 和您的应用程序中)。

是否有任何理由需要“您的应用程序中的单词”?为什么不写一个小字插件,然后在必要时从您的应用程序中启动 Word。然后插件可以与您的应用程序、数据库或 Word 中的任何必要内容进行通信。

用户可能会发现在任何情况下这是一种更有用的方法。

【讨论】:

  • Word 旨在由其他应用程序托管,例如使用 OLE 进行展望
  • 我的应用程序使用开放的 xml 格式来维护文本,我认为也许更好的解决方案是使用 word 编辑器来生成此文本。但我需要对编辑器进行一些控制,例如加粗一些文字等。我在互联网上搜索,发现使用DSO Farmer托管,对编辑器的控制更多。我找不到 DSO Farmer ...
  • 我已经通过使用 DSO 成帧器完成了这项工作,但它会有许多未解决的问题。或许写个词addin比较好。
  • @Ian,实际上,Outlook 使用 Word 作为电子邮件编辑器被证明是如此繁重和有问题,以至于 MSOffice 2010 完全取消了它。 Outlook 编辑器现在是一个非常精简的 word 版本,与 WinWord 本身完全分离。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-31
  • 1970-01-01
  • 1970-01-01
  • 2014-05-28
相关资源
最近更新 更多