2016-10-18 6 views
1

"디렉토리 선택"기능이 필요한 WPF (프리즘) 응용 프로그램이 있습니다. 메인 윈도우의 메뉴는 악명 높은 Prism InteractionRequest을 통해 하위 "설정"창을 엽니 다. "설정"창에는 "디렉토리 선택"창이 열리는 버튼이 있습니다.CommonOpenFileDialog (디렉토리 선택)를 호출하는 WPF/Prism 창이 선택 후 포커스를 잃습니다.

표준 FolderBrowserDialog 대화가 너무 추해서 Windows API Code Pack에서 CommonOpenFileDialog을 사용하려고했습니다. 내가 _selectDirectoryService.DetermineDirectory() 전화, 내보기 모델에서

using Microsoft.WindowsAPICodePack.Dialogs; 

public class MicrosoftApiSelectDirectoryService : ISelectDirectoryService 
{ 
    public bool DetermineDirectory() 
    { 
     var browserDialog = new CommonOpenFileDialog(); 
     browserDialog.IsFolderPicker = true; 
     browserDialog.Title = Title; 
     browserDialog.InitialDirectory = InitialDirectory; 

     if (browserDialog.ShowDialog() == CommonFileDialogResult.Ok) 
     { 
      DirectoryName = browserDialog.FileName; 
      return true; 
     } 

     DirectoryName = string.Empty; 
     return false; 
    } 
// ... 
} 

:

내가 대화 상자를 포장 Orc.Controls에서 서비스를 사용

public DelegateCommand SelectDirectoryCommand { get; private set; } 

    private void SelectDirectory() 
    { 
     if (_selectDirectoryService.DetermineDirectory()) 
     { 
      var dir = _selectDirectoryService.DirectoryName; 
      // ... 
     } 
    } 

문제가있는 CommonOpenFileDialog에 디렉토리를 선택한 후, "설정"창이 포커스를 잃습니다 (어떤 이유로 든 최대화 된 메인 윈도우 뒤에 숨어 있음). 반대로 FolderBrowserDialog은 "설정"창으로 포커스를 되돌립니다.

기본적으로 더 나은 "디렉토리 선택"구현이 필요하거나 MVVM 패턴의 심각한 위반없이 다시 "설정"창에 집중할 수있는 방법을 찾아야합니다. 어떤 아이디어라도 감사 할 것입니다.

+0

Windows 파일 브라우저에있는 모든 기능을 원하는 경우 자신의 디렉터리 브라우저를 만드는 작업이 많이 필요합니다. 그래서 나는 그것을 반대하는 것이 좋습니다. 필자는 DirectoryBrowser를 UI 컨트롤과 UI 레이어의 일부로 간주하므로 View의 코드 숨김에 관련 코드가 있습니다. 그게 너를위한 옵션이야? Focus 설정 또한 View 레이어의 책임입니다. 그래도 실제로 ViewModel 레이어의 일부로 생각한다면,보기 내에서 대화 상자를 올바르게 표시/숨기기위한 DialogService를 제안 할 것입니다. – Rachel

답변

0

Window의 부모/소유자를 설정해야 갑자기 그 뒤에 팝업되지 않습니다.

+0

무엇을 의미합니까? 메인 윈도우는 프리즘 : InteractionRequestTrigger (프리즘 : PopupWindowAction)를 통해 "설정"윈도우를 엽니 다. "Settings"창은 서비스를 호출하는 명령을 통해 CommonOpenFileDialog를 엽니 다. 그러나 CommonOpenFileDialog는 닫을 때 "설정"창으로 포커스를 반환하지 않습니다. – mechanic

+0

나는 내가 말한 것을 의미한다. 대화 상자 소유자를 설정하려면 서비스를 수정해야합니다. –

+0

더러운 해킹으로 다음 코드를 뒤에 넣습니다. Window parentWindow = Window.GetWindow (this); if (browserDialog.ShowDialog (parentWindow) == CommonFileDialogResult.Ok) { profileDirectory.Text = browserDialog.FileName; // ..; } 포커스 문제를 다소 해결했지만 MVVM을 위반합니다. 부모 창 핸들을 서비스에 전달하는 더 좋은 방법이 있는지 궁금합니다. – mechanic