visual una studio que net framework desarrollo asp aplicaciĆ³n aplicacion wpf editor ms-word ms-office avalonedit

una - wpf.net framework



Editor de Word 2010 incrustado en una aplicaciĆ³n wpf (2)

¿Cómo uso el editor de palabras en una aplicación WPF? ¿Es posible usar Windows Forms Hosting en WPF solamente? ¿Hay otra manera de lograr eso?

Encontré AvalonEdit pero no tiene las características que necesito. Entonces usando esta manera, mi problema no puede ser resuelto.

También hay algunas cosas por ahí para alojar un control de formularios de Windows en WPF, pero no pudo ser mi respuesta.

Quiero entender que hay una manera de usar Word Editor de forma nativa en una aplicación wpf. ¿Estarán disponibles todas las API en esa solución?

Gracias por adelantado.


Bueno, la palabra propiamente dicha no está diseñada técnicamente para ser alojada por otra aplicación, ya sea WPF, WINFORMS o cualquier otra cosa.

PUEDE usar trucos de api (como SetParent) para mover la ventana de Word principal a una ventana alojada de WPF. Lo he hecho antes, pero es un negocio bastante complicado y es muy fácil perder las cosas que causan los GPF (tanto en Word como en tu aplicación).

¿Hay alguna razón por la que deba ser "Word en tu aplicación"? ¿Por qué no escribir un pequeño complemento de Word y luego iniciar Word desde su aplicación cuando sea necesario? luego, el complemento puede comunicarse con su aplicación, su base de datos o lo que sea necesario desde Word.

Los usuarios pueden encontrar que es un enfoque más útil en cualquier caso.


Puede alojar MS Word (2007/2010 y probablemente otras versiones) desde un control WebBrowser, esto funciona en WinForms y también debería funcionar en WPF. Se proporciona una API de .NET para automatizar Word, documentada here . Los ensamblajes de interoperabilidad requeridos se envían con Office 2010, por lo que la implementación es mucho más simple que las versiones anteriores de Office.

Consulte este artículo de soporte de Microsoft para obtener más detalles sobre cómo alojar Word dentro de un control WebBrowser. La siguiente captura de pantalla muestra la palabra incrustada dentro de una aplicación Winforms host.

Tenga en cuenta que esto solo funciona de manera confiable para una sola instancia de Word alojada, por lo que no puede mostrar 2 documentos de Word uno al lado del otro en la misma aplicación. Además, a veces la cinta de opciones puede desaparecer, pero Word nunca ha hecho que la aplicación se bloquee.

Se requieren derechos administrativos para realizar las actualizaciones de registro requeridas, ya que existen problemas de seguridad potenciales. Un método fácil para hacer las actualizaciones del registro es escribir un script, pero el siguiente código (revisado / no probado) muestra cómo se puede hacer esto en c # para Word, Excel y 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; } } }