2016-10-18 36 views
1

"ディレクトリ選択"機能が必要なWPF(プリズム)アプリケーションがあります。メインウィンドウのメニューは、悪意のあるPrism InteractionRequestを介して子の「設定」ウィンドウを開きます。その "設定"ウィンドウには、 "ディレクトリの選択"ウィンドウを開くためのボタンがあります。CommonOpenFileDialog(選択ディレクトリ)を呼び出しているWPF/Prismウィンドウは、選択後にフォーカスが失われます

標準FolderBrowserDialogのダイアログはとても醜いので、私はから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のコードビハインドに関連するコードがあることがよくあります。それはあなたのための選択肢ですか?フォーカスの設定は、私の意見ではViewレイヤーの責任でもあります。あなたが実際にそれをViewModelレイヤーの一部と考えているなら、ビュー内でダイアログを正しく表示/非表示するためのDialogServiceを提案します。 – Rachel

答えて

0

ウィンドウの親/所有者を突然ポップするのを防ぐために、ウィンドウの親/所有者を設定する必要があります。

+0

どういう意味ですか?メインウィンドウは、プリズム:InteractionRequestTrigger(プリズム:PopupWindowAction)を介して「設定」ウィンドウを開きます。 「設定」ウィンドウは、サービスを呼び出すコマンドを介してCommonOpenFileDialogを開きます。しかし、CommonOpenFileDialogは、閉じたときに「設定」ウィンドウにフォーカスを戻しません。 – mechanic

+0

私が言ったことを意味する。ダイアログウィンドウの所有者を設定するには、サービスを変更する必要があります。 –

+0

汚れたハックとして、私はいくつかのコードをバックに入れます: ウィンドウparentWindow = Window.GetWindow(this); if(browserDialog.ShowDialog(parentWindow)== CommonFileDialogResult.Ok) { profileDirectory.Text = browserDialog.FileName; // ..; } これはちょっとした問題を解決しましたが、MVVMに違反しています。親ウィンドウのハンドルをサービスに渡すより良い方法があるのだろうかと思います。 – mechanic

関連する問題