2012-04-24 18 views
11

Ich schreibe eine WPF-App, und ich möchte this library verwenden.Get System.Windows.Forms.IWin32Window von WPF-Fenster

kann ich ein IntPtr für das Fenster erhalten, indem

new WindowInteropHelper(this).Handle 

verwenden, aber das wird nicht gegossen zu System.Windows.Forms.IWin32Window, die ich brauche diesen WinForms Dialog zu zeigen.

Wie kann ich IntPtr in System.Windows.Forms.IWin32Window umwandeln?

Antwort

24

OPTION 1

IWin32Window erwartet nur eine Handle Eigenschaft, die nicht zu schwierig zu implementieren, da Sie bereits die IntPtr haben. Create a wrapper Klasse, die IWin32Window implementiert:

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; 
} 

Sie dann Ihre IWin32Window wie diese bekommen würde:

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

oder (als Reaktion auf Keiths‘Vorschlag):

IWin32Window win32Window = new WindowWrapper(this); 

OPTION 2 (Danke an Scott Chamberlain's Kommentar)

Verwenden Sie die vorhandene NativeWindow-Klasse, die IWin32Window implementiert:

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

Große Antwort; Die Klasse könnte jedoch ein Fenster akzeptieren und auch die erste Ebene des WindowInteropHelper-Wrappings behandeln. Sie brauchen also nur "new WindowWrapper (this)" und Sie haben etwas, das Sie als IWin32Window übergeben können. – KeithS

+3

Anstatt eine eigene Klasse zu erstellen, stellt .NET eine ähnliche Klasse bereits in [NativeWindow] bereit (https://msdn.microsoft.com/en-us/library/system.windows.forms.nativewindow%28v=vs. 110% 29.aspx) Klasse. Rufen Sie einfach [AssignHandle (IntPtr) '] (https://msdn.microsoft.com/en-us/library/system.windows.forms.nativewindow.assignhandle (v = vs.110) .aspx) mit dem Handle von auf die vom OP bereitgestellte Funktion. –

+0

Ich konnte Option 2 nicht kompilieren. Mein Code ... 'System.Windows.Forms.IWin32Window win32Window = neues System.Windows.Forms.NativeWindow(); win32Window.AssignHandle (neues WindowInteropHelper (this) .Handle); ' ... führt zum Kompilierungsfehler" IWin32Window enthält keine Definition für AssignHandle ". Ich habe versucht, die System.Windows.Interop-Version von IWin32Window, aber das hat keine NativeWindow() -Methode. –