Я понимаю, что это старый вопрос, но вот подход, который мог бы быть немного более элегантной (и могут или не могут быть доступны раньше) ...
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.
}
}
}
}
На самом деле, d Это важно?
Я не уверен, если это имеет значение в этом случае, но, как правило, вы должны сказать Windows, что иерархия окна, так что, если родительское окно щелкнуло в то время как дочернее окно является модальным, Windows может обеспечить визуальный (и, возможно, слышимый) ключ к пользователю.
Кроме того, это гарантирует, что «правильное» окно находится сверху, когда есть несколько модальных окон (не то, что я выступаю за такой дизайн пользовательского интерфейса). Я видел пользовательские интерфейсы, разработанные определенной многомиллиардной корпорацией (оболочка которой остается неназванной), которая висела просто потому, что один модальный диалог «застрял» под другим, и пользователь понятия не имел, что это было даже там, не говоря уже о том, как закрыть Это.
Ознакомьтесь с фантастическим [Ookii.Dialogs] Свена Грота (как для WinForms и WPF, так и для WindowsForms и WPF). – 2012-03-02 19:01:51