我想在LINQPad脚本中浏览一个文件夹,所以我尝试使用FolderBrowserDialog。它没有用。
这是一个显示我正在做什么的片段?
string path = "";
var browser = new FolderBrowserDialog { ShowNewFolderButton = false };
if (browser.ShowDialog() == DialogResult.OK)
{
path = browser.SelectedPath;
}
这会在ShowDialog()的行上运行并挂起,黄色执行指针对着该行,但文件夹浏览器对话框不可见。
我知道ShowDialog()有一个重载需要一个IWin32Window owner
参数,并认为这可能是解决方案,但尚未找到如何为主LINQPad窗口获取IWin32Window 。我希望Util类可以提供一种方法,但除非我错过了它,否则它似乎没有。
任何人都有解决这个问题的建议吗?
答案 0 :(得分:2)
将Run each query in its own process
选项设置为true是导致问题的原因。将该选项设置回默认值false允许上述代码按预期运行。
但是,进行此更改会禁用内置调试。此外,这种行为仍然存在一些问题。
首次运行脚本时,将显示对话框,并且在选择“确定”或“取消”后脚本将运行至完成。但是,在第二次运行脚本时,它会按照问题中的描述挂起。取消执行并再次运行后,对话框会显示,但之后的时间会再次挂起,依此类推。
有人指出,设置Always use fresh application domains
选项可以解决这个问题,并允许在每次执行脚本时显示对话框。
答案 1 :(得分:1)
不是解决方案,而是FilePicker
(新的LinqPad输入控件的一部分)。
您可以写:
new FilePicker().Dump().TextInput += (x, e) => ((FilePicker)x).Text.Dump();
或:
var picker = new FilePicker();
picker.TextInput += (x, e) => {
var fileName = picker.Text;
//action with the file...
};
答案 2 :(得分:0)
我刚遇到LINQPad 5的问题。我需要一个类似于文件选择器的文件夹选择器。您的解决方案无需我修改LINQPad5设置即可工作。问题是对话框停留在后台。因此,这就是我如何使您的代码片段集中处理该对话框的方法。我没有使用FolderBrowseDialog.ShowDialog(),而是使用了以Windows窗体传递的重载。我创建了一个具有描述和窗口位置的新表单,然后将其传递给ShowDialog。这样我就可以设置说明和窗口位置。
string path = "";
using ( var browser = new System.Windows.Forms.FolderBrowserDialog { ShowNewFolderButton = false })
{
browser.Description = "Select Folder For Foo Processing";
var form = new System.Windows.Forms.Form(){TopMost = true, TopLevel = true};
var result = browser.ShowDialog(form);
if (result == System.Windows.Forms.DialogResult.OK)
{
path = browser.SelectedPath;
}
}
path.Dump();
我尝试使用设置在ShowDialog中初始化表单,但是遇到了问题,因此我选择在show dialog之前声明它。希望这对任何解决此问题的人都有帮助。