17

我正在编写一个 WPF 应用程序,我想利用这个库

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

new WindowInteropHelper(this).Handle

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

我该如何IntPtr投到 System.Windows.Forms.IWin32Window

4

1 回答 1

36

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

然后你会得到你的 IWin32Window 像这样:

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

或(响应 KeithS 的建议):

IWin32Window win32Window = new WindowWrapper(this);

选项 2(感谢 Scott Chamberlain 的评论)

使用现有的实现 IWin32Window 的 NativeWindow 类:

NativeWindow win32Parent = new NativeWindow();
win32Parent.AssignHandle(new WindowInteropHelper(this).Handle);
于 2012-04-24T10:55:28.680 回答