从WPF窗口获取System.Windows.Forms.IWin32Window

Ars*_*ray 12 c# wpf winforms

我正在写一个WPF应用程序,我想使用这个库.

我可以IntPtr通过使用获得一个窗口

new WindowInteropHelper(this).Handle
Run Code Online (Sandbox Code Playgroud)

但这不会转换System.Windows.Forms.IWin32Window为我需要显示此WinForms对话框.

我该如何投IntPtrSystem.Windows.Forms.IWin32Window

Tun*_*ung 29

选项1

IWin32Window只需要一个Handle属性,因为你已经有了IntPtr,所以这个属性并不难实现. 创建一个实现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;
}
Run Code Online (Sandbox Code Playgroud)

然后你会得到你的IWin32Window:

IWin32Window win32Window = new WindowWrapper(new WindowInteropHelper(this).Handle);
Run Code Online (Sandbox Code Playgroud)

或(根据KeithS的建议):

IWin32Window win32Window = new WindowWrapper(this);
Run Code Online (Sandbox Code Playgroud)

选项2(对Scott Chamberlain的评论)

使用现有的NativeWindow类,它实现了IWin32Window:

NativeWindow win32Parent = new NativeWindow();
win32Parent.AssignHandle(new WindowInteropHelper(this).Handle);
Run Code Online (Sandbox Code Playgroud)

  • 而不是创建自己的类.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提供的功能. (4认同)