2012-04-24 15 views

Respuesta

24

OPCIÓN 1

IWin32Window sólo se espera una propiedad Handle, lo cual no es demasiado difícil de implementar ya que ya tiene la IntPtr. Create a wrapper clase que implementa IWin32Window:

public class WindowWrapper : System.Windows.Forms.IWin32Window 
{ 
    public WindowWrapper(IntPtr handle) 
    { 
     _hwnd = handle; 
    } 

    public WindowWrapper(Window window) 
    { 
     _hwnd = new WindowInteropHelper(window).Handle; 
    } 

    public IntPtr Handle 
    { 
     get { return _hwnd; } 
    } 

    private IntPtr _hwnd; 
} 

A continuación, obtener su IWin32Window así:

IWin32Window win32Window = new WindowWrapper(new WindowInteropHelper(this).Handle); 

o (en respuesta a la sugerencia de Keith'):

IWin32Window win32Window = new WindowWrapper(this); 

OPCIÓN 2 (gracias al comentario de Scott Chamberlain)

Utilice la clase NativeWindow existente, que implementa IWin32Window:

IWin32Window win32Window = new NativeWindow(); 
((NativeWindow)win32Window).AssignHandle(new WindowInteropHelper(this).Handle); 
+0

Gran respuesta; la clase, sin embargo, podría aceptar una ventana y manejar la primera capa de envoltura de WindowInteropHelper, así que todo lo que necesita es 'new WindowWrapper (esto)' y tiene algo que pasar como IWin32Window. – KeithS

+3

En lugar de crear su propia clase, .NET proporciona una clase similar ya en su ['NativeWindow'] (https://msdn.microsoft.com/en-us/library/system.windows.forms.nativewindow%28v=vs. Clase 110% 29.aspx). Simplemente llame a ['AssignHandle (IntPtr)'] (https://msdn.microsoft.com/en-us/library/system.windows.forms.nativewindow.assignhandle (v = vs.110) .aspx) con el controlador desde la función proporcionada por el OP. –

+0

No pude obtener la Opción 2 para compilar. Mi código ... 'System.Windows.Forms.IWin32Window win32Window = new System.Windows.Forms.NativeWindow(); win32Window.AssignHandle (new WindowInteropHelper (this) .Handle); ' ... provoca el error de compilación" IWin32Window no contiene una definición para AssignHandle ". Intenté usar la versión System.Windows.Interop de IWin32Window pero eso no tiene un método NativeWindow(). –

Cuestiones relacionadas