Mos*_*aei 17 wpf ms-word editor ms-office avalonedit
如何在WPF应用程序中使用单词编辑器?是否可以仅使用WPF中的Windows窗体托管?还有另一种方法可以实现吗?
我找到了AvalonEdit,但它没有我需要的功能.所以使用这种方式,我的问题可能无法解决.
还有一些东西在WPF中托管Windows窗体控件,但它不是我的答案.
我想知道有没有办法在wpf应用程序中以原生方式使用word编辑器?是否所有API都可以在该解决方案中使用?
提前致谢.
pgf*_*aro 11
您可以在WebBrowser控件中托管MS Word(2007/2010,可能还有其他版本),这可以在WinForms中运行,也可以在WPF中运行.提供了一个用于自动化Word的.NET API,此处记录在案.所需的互操作程序集随Office 2010一起提供,因此部署比以前的Office版本简单得多.
有关在WebBrowser控件中托管Word的更多详细信息,请参阅此Microsoft支持文章.下面的屏幕截图显示了嵌入在主机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; }
}
}
Run Code Online (Sandbox Code Playgroud)
嗯,从技术上讲,Word 本身并不是设计为由其他应用程序托管的,无论是 WPF、WINFORMS 还是其他任何应用程序。
您可以使用 api 技巧(如 SetParent)将主 Word 窗口移动到 WPF 托管窗口中。我以前做过,但这是一件非常棘手的事情,而且很容易错过导致 GPF 的事情(在 Word 和您的应用程序中)。
有什么理由需要它是“应用程序中的Word”吗?为什么不编写一些 Word 插件,然后在必要时从您的应用程序启动 Word。然后插件可以与您的应用程序、数据库或 Word 中所需的任何内容进行通信。
无论如何,用户可能会发现这是一种更有用的方法。
| 归档时间: |
|
| 查看次数: |
13720 次 |
| 最近记录: |