Я понимаю, что это старый вопрос, но вот подход, который может быть немного более элегантным (и может быть, а может и не был доступен раньше) ...
using System;
using System.Windows;
using System.Windows.Forms;
// ...
/// <summary>
/// Utilities for easier integration with WinForms.
/// </summary>
public static class WinFormsCompatibility {
/// <summary>
/// Gets a handle of the given <paramref name="window"/> and wraps it into <see cref="IWin32Window"/>,
/// so it can be consumed by WinForms code, such as <see cref="FolderBrowserDialog"/>.
/// </summary>
/// <param name="window">
/// The WPF window whose handle to get.
/// </param>
/// <returns>
/// The handle of <paramref name="window"/> is returned as <see cref="IWin32Window.Handle"/>.
/// </returns>
public static IWin32Window GetIWin32Window(this Window window) {
return new Win32Window(new System.Windows.Interop.WindowInteropHelper(window).Handle);
}
/// <summary>
/// Implementation detail of <see cref="GetIWin32Window"/>.
/// </summary>
class Win32Window : IWin32Window { // NOTE: This is System.Windows.Forms.IWin32Window, not System.Windows.Interop.IWin32Window!
public Win32Window(IntPtr handle) {
Handle = handle; // C# 6 "read-only" automatic property.
}
public IntPtr Handle { get; }
}
}
Затем из окна WPF вы можете просто ...
public partial class MainWindow : Window {
void Button_Click(object sender, RoutedEventArgs e) {
using (var dialog = new FolderBrowserDialog()) {
if (dialog.ShowDialog(this.GetIWin32Window()) == System.Windows.Forms.DialogResult.OK) {
// Use dialog.SelectedPath.
}
}
}
}
На самом деле, это имеет значение?
Я не уверен, имеет ли это значение в данном случае , но, как правило, вы должны указать Windows, какова ваша иерархия окон, поэтому, если щелкнуть родительское окно, в то время как дочернее окно модально, Windows может предоставить визуальная (и, возможно, слышимая) подсказка для пользователя.
Кроме того, он гарантирует, что «правильное» окно находится сверху при наличии нескольких модальных окон (не то, чтобы я выступал за такой дизайн пользовательского интерфейса). Я видел пользовательские интерфейсы, разработанные некой многомиллиардной корпорацией (эта оболочка осталась безымянной), которая зависла просто потому, что один модальный диалог «застрял» под другим, и пользователь не имел ни малейшего представления, что он даже там, не говоря уже о том, как закрыть это.