如果你确定要使用FolderBrowserDialog,我会使用这种设计。
首先,在您的视图上创建一个 DependencyProperty 以公开其句柄。
public static readonly DependencyProperty WindowHandleProperty =
DependencyProperty.Register("WindowHandle", typeof(System.Windows.Forms.IWin32Window), typeof(MainWindow), new PropertyMetadata(null));
// MainWindow.cs
public System.Windows.Forms.IWin32Window WindowHandle
{
get { return (System.Windows.Forms.IWin32Window)GetValue(WindowHandleProperty); }
set { SetValue(WindowHandleProperty, value); }
}
现在,当您的窗口加载时,您可以使用链接到的问题中提供的扩展名检索句柄:
// MainWindow.cs
void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
var binding = new Binding();
binding.Path = new PropertyPath("WindowHandle");
binding.Mode = BindingMode.OneWayToSource;
SetBinding(WindowHandleProperty, binding);
WindowHandle = this.GetIWin32Window();
}
因此,您使用“WindowHandle”属性将单向绑定到源。因此,如果您的 ViewModel 具有 WindowHandle 属性,它将与相关视图的有效 IWin32Handle 保持同步:
// ViewModel.cs
private System.Windows.Forms.IWin32Window _windowHandle;
public System.Windows.Forms.IWin32Window WindowHandle
{
get
{
return _windowHandle;
}
set
{
if (_windowHandle != value)
{
_windowHandle = value;
RaisePropertyChanged("WindowHandle");
}
}
}
这是一个很好的解决方案,因为您没有硬编码一个 ViewModel 来与一个特定的 View 配对。如果您使用具有相同 ViewModel 的多个视图,它应该可以正常工作。如果您创建了一个新视图但您没有实现 DependencyProperty,它只会使用空句柄进行操作。
编辑:
附带说明一下,您是否实际测试过不提供 IWin32Owner 参数?对我来说,它仍然会自动作为应用程序的模式对话框打开,并阻止用户与应用程序的所有窗口进行交互。你还需要它做其他事情吗?