调用CommonOpenFileDialog(选择目录)的WPF / Prism窗口在选择后失去焦点

时间:2016-10-18 15:08:52

标签: wpf mvvm prism windows-api-code-pack

我有一个WPF(Prism)应用程序需要"选择目录"功能。主窗口的菜单会打开一个孩子"设置"窗口通过臭名昭着的棱镜InteractionRequest。那"设置"窗口有一个按钮,用于打开"选择目录"窗口。

由于标准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模式。任何想法都将不胜感激。

1 个答案:

答案 0 :(得分:0)

您必须设置窗口的父级/拥有者,以防止它突然弹出窗口。