如何在 LINQPad 中显示 FolderBrowserDialog?

How can I display a FolderBrowserDialog in LINQPad?

我想在 LINQPad 脚本中浏览文件夹,所以我尝试使用 FolderBrowserDialog。没用。

这是显示我在做什么的片段?

string path = "";
var browser = new FolderBrowserDialog { ShowNewFolderButton = false };
if (browser.ShowDialog() == DialogResult.OK)
{
    path = browser.SelectedPath;
}

它在 ShowDialog() 行上运行并挂起,黄色执行指针指向该行,但文件夹浏览器对话框不可见。

我知道 ShowDialog() 有一个重载,它接受一个 IWin32Window owner 参数,我认为这可能是解决方案,但还没有弄清楚如何为主要的 LINQPad window。我希望 Util class 可以提供一种方法,但除非我遗漏了它,否则它似乎没有。

有人对解决这个问题有建议吗?

Run each query in its own process 选项设置为 true 是问题的原因。将该选项设置回默认值 false 允许上述代码按预期 运行。

但是,进行此更改会禁用 built-in 调试。此外,该行为仍然存在一些问题。

首先 运行 显示对话框,然后 运行 选择确定或取消后脚本完成。但是,在 运行 脚本第二次挂起时,如问题中所述。取消执行并再次 运行 后,对话框会显示,但在那之后它会再次挂起,依此类推。

有人指出,设置 Always use fresh application domains 选项可能会解决这个问题,而且确实如此,允许在每次执行脚本时显示对话框。

我刚刚在使用 LINQPad 5 时遇到了这个问题。我需要一个类似于文件选择器的文件夹选择器。您的解决方案无需我修改 LINQPad5 设置即可工作。问题是对话框停留在后台。所以这就是我如何让你的代码片段与焦点对话一起工作。我没有使用 FolderBrowseDialog.ShowDialog(),而是使用以 windows 形式传递的重载。我创建了一个带有描述和 window 位置的新表单,然后将其传递给 ShowDialog。这让我可以设置描述和 window 定位。

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 中初始化表单,但遇到了问题所以我选择在显示对话框之前声明它。希望这可以帮助任何人解决这个问题。

不是解决方案,而是替代方案,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...
};

完整示例:

void Main()
{
    new FilePicker().Dump().TextInput += (x, e) => procces(((FilePicker)x).Text);
}

void procces(string file)
{
    file.Dump("chosen file...");
    //...
}