我使用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更好(这不丑陋)?
答案 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()
这使窗口不会退回。