2016-10-18 52 views
1

我有一個WPF(Prism)應用程序需要「選擇目錄」功能。主窗口的菜單通過臭名昭着的Prism InteractionRequest打開一個孩子的「設置」窗口。該「設置」窗口有一個按鈕來打開「選擇目錄」窗口。WPF/Prism窗口調用CommonOpenFileDialog(選擇目錄)後選擇丟失焦點

由於標準FolderBrowserDialog對話框非常難看,我嘗試使用Windows API Code Pack中的CommonOpenFileDialog

我使用Orc.Controls一個服務包的對話框:

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; 
    } 
// ... 
} 

從我的瀏覽模式,我稱之爲_selectDirectoryService.DetermineDirectory()

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(prism:PopupWindowAction)。 「設置」窗口通過調用服務的命令打開CommonOpenFileDialog。但CommonOpenFileDialog在關閉時不會將焦點返回到「設置」窗口。 – mechanic

+0

我的意思是我說的。您需要修改您的服務以設置對話窗口的所有者。 –

+0

作爲一個骯髒的黑客,我把一些代碼放在後面: Window parentWindow = Window.GetWindow(this); (browserDialog.ShowDialog(parentWindow)== CommonFileDialogResult.Ok) profileDirectory.Text = browserDialog.FileName; // ..; } 它有點解決了失去焦點的問題,但違反了MVVM。我想知道是否有更好的方法將父窗口句柄傳遞給服務。 – mechanic