2012-04-24 30 views
11

私はWPFアプリケーションを作成しています。this libraryを使用したいと思います。WPFウィンドウからSystem.Windows.Forms.IWin32Windowを取得します。

私は

new WindowInteropHelper(this).Handle 

を使用してウィンドウのIntPtrを得ることができますが、それは私がこのWinFormsのダイアログを表示する必要がある、System.Windows.Forms.IWin32Windowにキャストしません。

IntPtrSystem.Windows.Forms.IWin32Windowにキャストするにはどうすればよいですか?

答えて

24

OPTION 1

IWin32WindowだけあなたはすでにのIntPtrを持っているので、実装するにはあまりにも難しいことではありませんHandleプロパティを、期待しています。 IWin32Windowを実装Create a wrapperクラス:

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

または(KeithS」提案に応じて)::

IWin32Window win32Window = new WindowWrapper(this); 

OPTION 2

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

あなたは、このようなあなたのIWin32Windowになるだろう(スコットチェンバレンのコメントにthx)

IWin32Windowを実装する既存のNativeWindowクラスを使用します。

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

偉大な答えです。しかし、クラスはWindowを受け取り、WindowInteropHelperの最初のレイヤーを扱うこともできるので、必要なのは 'new WindowWrapper(this)'だけで、何かをIWin32Windowとして渡すことができます。 – KeithS

+3

独自のクラスを作成する代わりに、.NETは既に['NativeWindow'](https://msdn.microsoft.com/en-us/library/system.windows.forms.nativewindow%28v=vs)に同様のクラスを用意しています。 110%29.aspx)クラス。ハンドルを使って['AssignHandle(IntPtr)'](https://msdn.microsoft.com/en-us/library/system.windows.forms.nativewindow.assignhandle(v = vs.110).aspx) OPによって提供される機能。 –

+0

オプション2をコンパイルできませんでした。私のコード... 'System.Windows.Forms.IWin32Window win32Window = new System.Windows.Forms.NativeWindow(); win32Window.AssignHandle(new WindowInteropHelper(this).Handle); ' ...「IHin32WindowにはAssignHandleの定義がありません」というコンパイルエラーが発生します。 IWin32WindowのSystem.Windows.Interopバージョンを使用しようとしましたが、NativeWindow()メソッドがありません。 –

関連する問題