19/01/2011

Interoperabilidad entre WPF y WinForms

Hoy tuve un problema durante el proceso de desarrollo de un sistema en WPF y WinForms, sucede que el proyecto está hecho en WPF y eventualmente se utilizaron WinForms para su manejo pero la interoperabilidad no viene habilitada por defecto, es decir, al instanciar una clase de tipo WinForm desde el WPF y mostrarla con el método Show() no tengo la posibilidad de cambiar entre controles dentro del WinForm con la tecla TAB, lo que al mostrarlo con el método ShowDialog() me funciona perfectamente; ahora bien, hay una solución bastante sencilla pero que me ha costado unas cuantas horas de investigación y publico aquí la solución:

- Agregar a las referencias del proyecto la libreria WindowsFormsIntegration, generalmente localizada en %ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.0\WindowsFormsIntegration.dll

- Importar la librería dentro del proyecto WPF de la siguiente manera: Imports System.Windows.Forms.Integration

- Después de llamar al WinForm con el método .Show(), habilitar la interoperabilidad de la siguiente manera: System.Windows.Forms.Integration.WindowsFormsHost.EnableWindowsFormsInterop()

Eso es todo, espero que a alguien le sea útil.

Nota. Si es un proyecto WinForm y se agrega un WPF y se quiere la interoperabilidad, lo unico que cambia es la manera de habilitarla, se hace de la siguiente forma: System.Windows.Forms.Integration.ElementHost.EnableModelessKeyboardInterop()