CommonOpenFileDialog将我的窗口放在所有其他窗口后面

时间:2016-01-21 11:35:26

标签: c# wpf mvvm

我使用CommonOpenFileDialog(来自Windows API Code Pack)来选择一个目录,并以某种方式将我的窗口发送到后面。这真是令人沮丧,因为我必须在任务栏中找到它并再次单击它。

以下是代码:

    public string ShowPickDirectoryDialog()
    {
        var dialog = new CommonOpenFileDialog { IsFolderPicker = true };
        if (dialog.ShowDialog() == CommonFileDialogResult.Ok)
        {
            return dialog.FileName;
        }
        return null;
    }

我在这里找到了一个类似的问题:

How to bring the main form back to the front after the file open dialog is closed

但是我使用WPF / MVVM并且无法访问窗口对象,因此这些答案都不起作用。那么当我无法访问窗口对象时,如何在使用CommonOpenFileDialog之后确保我的窗口位于前面?我也无法使用" TopMost"设置为将窗口放在目录选择器前面。

或者有什么比我应该使用的CommonOpenFileDialog更好(这不丑陋)?

3 个答案:

答案 0 :(得分:1)

使用 WPF 和 MVVM,您可以尝试此解决方案(安装 MVVMLight nuget):

视图模型

    public RelayCommand<YourWindow> ChooseFolderStringCommand { get; set;}

以构造函数为例:

      ChooseFolderStringCommand = new RelayCommand<YourWindow>( o => ChooseFolder(o));

    private void ChooseFolder(YourWindow win)
    {
            using (var dialog = new CommonOpenFileDialog {IsFolderPicker = true})
            {
                
                CommonFileDialogResult result = dialog.ShowDialog();

                if (result == CommonFileDialogResult.Ok)
                    ...
            }


            win?.Activate();
        }

在触发ChooseFolder命令的按钮中:

在 XAML 中


<Button Command="{Binding ChooseFolderStringCommand}" CommandParameter="{Binding ElementName=YourWindow}">

希望这会有所帮助。

答案 1 :(得分:0)

您可以在打开打开的文件对话框之前获得当前活动的窗口,然后在对话框关闭后重新调整焦点。

理想情况下,此方法将用于服务中。这样做的好处是,没有其他任何东西需要引用特定拥有的View了,可以通过此方法获得它。

    public string PromptForDirectorySelection(string summary, string initialPath)
    {
        var browserDialog = new CommonOpenFileDialog
        {
            Title = summary,
            IsFolderPicker = true,
            InitialDirectory = initialPath,
            AddToMostRecentlyUsedList = true,
            AllowNonFileSystemItems = false,
            EnsureFileExists = false,
            EnsurePathExists = true,
            EnsureReadOnly = false,
            EnsureValidNames = true,
            Multiselect = false,
            ShowPlacesList = true
        };

        // get the current active window, prior to showing and closing this dialog, so it can be re-focused later.
        var window = Application.Current.Windows.OfType<Window>().SingleOrDefault(w => w.IsActive);

        var dialogResult = browserDialog.ShowDialog();
        if (null != window)
        {
            window.Focus();
        }
        if (dialogResult == CommonFileDialogResult.Ok)
        {
            return browserDialog.FileName;
        }

        return null;
    }

答案 2 :(得分:0)

这很好用,但我更喜欢使用:

var window = Application.Current.Windows.OfType<Window>().SingleOrDefault(w => w.IsActive);
var dialogResult = browserDialog.ShowDialog(window);

并且不要使用window.Focus()

这使窗口不会退回。