2012-04-24 3 views
11

WPF 앱을 작성 중이므로 this library을 사용하고 싶습니다.WPF 창에서 System.Windows.Forms.IWin32Window 가져 오기

나는

new WindowInteropHelper(this).Handle 

를 사용하여 윈도우에 대한 IntPtr를 얻을 수 있지만 내가이 윈폼 대화 상자를 표시해야 System.Windows.Forms.IWin32Window, 캐스팅하지 않습니다.

IntPtrSystem.Windows.Forms.IWin32Window으로 어떻게 캐스팅합니까?

답변

24

옵션 1

IWin32Window은 당신이 이미 IntPtr입니다이 있기 때문에 구현하기가 너무 어려워하지 않은 Handle 속성을 기대하고있다. 구현 Create a wrapper 클래스 IWin32Window :

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

또는 (KeithS '제안에 대한 응답) : 당신은 다음 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; 
} 

IWin32Window win32Window = new WindowWrapper(this); 

옵션을 2 (스콧 체임벌린의 코멘트에 thx)

IWin32Window를 구현하는 기존 NativeWindow 클래스를 사용하십시오.

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

위 답변; 그래도 클래스는 Window를 받아 들일 수 있고 WindowInteropHelper의 첫 번째 레이어도 처리 할 수 ​​있으므로 필요한 것은 새로운 WindowWrapper (이)와 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 (새 WindowInteropHelper (this) .Handle); ... "IWin32Window에 AssignHandle에 대한 정의가 없습니다"라는 컴파일 오류가 발생합니다. IWin32Window의 System.Windows.Interop 버전을 사용해 보았지만 NativeWindow() 메서드가 없습니다. –