I'm developing a WPF desktop application (C# and .NET 3.5) that needs to pop up a dialog window allowing the user to browse for a folder. .NET provides a convenient (and bland) dialog that does this: System.Windows.Forms.FolderBrowserDialog. To pop up this dialog as modal from my app, I must call its ShowDialog method. Since I want it to be a child of my main window, I need to pass it the parent window, which should be straightforward given the "owner" parameter to the method in question:
DialogResult ShowDialog(System.Windows.Forms.IWin32Window owner);
The problem is, the would-be parent window of that dialog is of type System.Window, not IWin32Window, so "this.Owner" won't match the datatype of ShowDialog's "owner" parameter. So, given that I have a WPF System.Window-derived parent class, where do I obtain an IWin32Window object?
Well, it turns out I have to write a tiny bit of code for it. Specifically, I must implement the IWin32Window interface on the parent window's class:
public partial class Main : Window,
System.Windows.Forms.IWin32Window
{
...
#region IWin32Window implementation
IntPtr System.Windows.Forms.IWin32Window.Handle
{
get
{
return ((HwndSource)
PresentationSource.FromVisual(this)).Handle;
}
}
#endregion
...
}
With the IWin32Window.Handle property now implemented in the parent class, I can simply call ShowDialog(this). Note that you must also include a "using System.Windows.Interop" for this to work.
1 comment:
Thank you! Having the parent solved a random problem for me where the window was opened behind the main application but had focus and was modal.
Post a Comment