我有一個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模式。任何想法,將不勝感激。
創建自己的目錄瀏覽器的工作很多,特別是如果您希望它具有Windows文件瀏覽器所具有的所有功能時。所以我會建議反對。對我而言,我將DirectoryBrowser視爲一個UI控件,並且是我的應用程序UI層的一部分,因此我經常在View的代碼隱藏中使用我的相關代碼。這是你的選擇嗎?在我看來,設置焦點也是View層的責任。如果你真的認爲它是ViewModel層的一部分,我會建議某種DialogService在視圖中正確顯示/隱藏對話框 – Rachel