Jeśli chcesz używać FolderBrowserDialog, użyłbym tego rodzaju projektu.
Najpierw utwórz DependencyProperty w swoim widoku, aby odsłonić uchwyt.
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); }
}
Teraz, kiedy okno ładunki można pobrać uchwyt przy użyciu rozszerzeń przewidzianych w pytaniu ty związane z:
// 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();
}
tak, to są wiążące w jedną stronę do źródła przy użyciu " "Właściwość WindowHandle". Więc jeśli ViewModel ma właściwość windowhandle, będzie uaktualniane z obowiązującym IWin32Handle dla powiązanego widzenia:
// 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");
}
}
}
Jest to dobre rozwiązanie, ponieważ nie jesteś ciężko kodowania jeden ViewModel być sparowany z jednym określonym widokiem. Jeśli używasz wielu widoków z tym samym ViewModel, to po prostu powinno działać. Jeśli utworzysz nowy widok, ale nie wdrożysz DependencyProperty, będzie on działał tylko z uchwytem pustym.
EDIT:
Na marginesie, czy faktycznie testowany właśnie nie zapewniając parametr IWin32Owner? Dla mnie nadal automatycznie otwiera się jako modalne okno dialogowe dla aplikacji i blokuje użytkownikowi interakcję ze wszystkimi oknami aplikacji. Czy jest coś innego, czego potrzebujesz?
On musi jeszcze zdać IWin32Window do FolderBrowserDialog na to, aby pokazać, jak właściwego okna modalnego . Chce wiedzieć, jak zaprogramować ViewModel, aby móc pobrać IWin32Window z bieżącego widoku. –
Tak i to jest szczegół implementacji. Tak jak powiedziałem, jeśli implementujesz interfejs, implementacja może zrobić, co tylko chce. Viewmodel nie musi nic wiedzieć. Bieżący widok można uzyskać przy użyciu aplikacji Application.Current.Windows.Where (x => x.IsActive = true) –