首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从WPF应用程序使用FolderBrowserDialog

如何从WPF应用程序使用FolderBrowserDialog
EN

Stack Overflow用户
提问于 2008-11-24 19:26:52
回答 8查看 111.2K关注 0票数 56

我正在尝试使用我的WPF应用程序中的FolderBrowserDialog -没什么特别的。我不太关心它是否具有Windows窗体的外观。

但是,当我调用ShowDialog时,我想传递所有者窗口,它是一个IWin32Window。我如何从我的WPF控件中获得它?

实际上,这有关系吗?如果我运行这段代码并使用不带参数的ShowDialog重载,它工作得很好。在什么情况下我需要通过所有者窗口?

谢谢,

克雷格

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2008-11-24 20:53:25

这是我的最终版本。

代码语言:javascript
运行
复制
public static class MyWpfExtensions
{
    public static System.Windows.Forms.IWin32Window GetIWin32Window(this System.Windows.Media.Visual visual)
    {
        var source = System.Windows.PresentationSource.FromVisual(visual) as System.Windows.Interop.HwndSource;
        System.Windows.Forms.IWin32Window win = new OldWindow(source.Handle);
        return win;
    }

    private class OldWindow : System.Windows.Forms.IWin32Window
    {
        private readonly System.IntPtr _handle;
        public OldWindow(System.IntPtr handle)
        {
            _handle = handle;
        }

        #region IWin32Window Members
        System.IntPtr System.Windows.Forms.IWin32Window.Handle
        {
            get { return _handle; }
        }
        #endregion
    }
}

并实际使用它:

代码语言:javascript
运行
复制
var dlg = new FolderBrowserDialog();
System.Windows.Forms.DialogResult result = dlg.ShowDialog(this.GetIWin32Window());
票数 63
EN

Stack Overflow用户

发布于 2008-11-24 19:30:34

如果您指定Owner,您将在指定的WPF窗口上获得一个模态对话框。

要获得与WinForms兼容的Win32窗口,请创建一个实现IWin32Window的类,如下所示

代码语言:javascript
运行
复制
 public class OldWindow : System.Windows.Forms.IWin32Window
{
    IntPtr _handle;

    public OldWindow(IntPtr handle)
    {
        _handle = handle;
    }

    #region IWin32Window Members

    IntPtr System.Windows.Forms.IWin32Window.Handle
    {
        get { return _handle; }
    }

    #endregion
}

并在您的WinForms中使用此类的实例

代码语言:javascript
运行
复制
        IntPtr mainWindowPtr = new WindowInteropHelper(this).Handle; // 'this' means WPF Window
        folderBrowserDialog.ShowDialog(new OldWindow(mainWindowPtr));
票数 17
EN

Stack Overflow用户

发布于 2008-11-24 20:27:42

好了,现在想明白了-感谢Jobi,他的答案很接近,但不完全是。

在WPF应用程序中,下面是我的代码:

首先是一个助手类:

代码语言:javascript
运行
复制
private class OldWindow : System.Windows.Forms.IWin32Window
{    
    IntPtr _handle;    
    public OldWindow(IntPtr handle)
    {
        _handle = handle;
    }   

    #region IWin32Window Members    
    IntPtr System.Windows.Forms.IWin32Window.Handle
    {
        get { return _handle; }
    }    
    #endregion
}

然后,使用这个:

代码语言:javascript
运行
复制
    System.Windows.Forms.FolderBrowserDialog dlg = new FolderBrowserDialog();
    HwndSource source = PresentationSource.FromVisual(this) as HwndSource;
    System.Windows.Forms.IWin32Window win = new OldWindow(source.Handle);
    System.Windows.Forms.DialogResult result = dlg.ShowDialog(win);

我确信我可以更好地总结这一点,但基本上它是有效的。耶!:-)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/315164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档