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가 짝을 하드 코딩하지이기 때문에
// 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이 WindowHandle 속성이한다면, 그것은 관련 뷰의 유효 IWin32Handle 최신 상태로 유지됩니다 하나의 특정보기. 동일한 ViewModel을 사용하여 여러 개의보기를 사용하는 경우 그냥 작동해야합니다. 새보기를 작성했지만 DependencyProperty를 구현하지 않으면, 이는 단지 null 핸들로 작동합니다.
편집 : 보조 노트로
, 당신은 실제로 단지 IWin32Owner 매개 변수를 제공하지 않는 테스트 한? 나에게는 여전히 응용 프로그램의 모달 대화 상자로 자동 열리고 사용자가 모든 응용 프로그램의 창과 상호 작용하지 못하도록 차단합니다. 그 대신 당신이해야 할 일이 있습니까?
. 그는 현재보기의 IWin32Window를 검색 할 수 있도록 ViewModel을 프로그래밍하는 방법을 알고 싶어합니다. –
예, 구현 세부 사항입니다. 내가 말했듯이, 당신이 인터페이스를 구현한다면, 구현은 원하는대로 할 수 있습니다. ViewModel은 아무 것도 알 필요가 없습니다. Application.Current.Windows.Where (x => x.IsActive = true)에 의해 현재 뷰를 얻을 수 있습니다. –