【问题标题】:How can I display a FolderBrowserDialog in LINQPad?如何在 LINQPad 中显示 FolderBrowserDialog?
【发布时间】:2016-01-02 10:55:28
【问题描述】:

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

这是一个显示我在做什么的 sn-p?

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

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

我知道 ShowDialog() 有一个重载,它接受 IWin32Window owner 参数并认为这可能是解决方案,但还没有弄清楚如何为主 LINQPad 窗口获取 IWin32Window。我希望 Util 类可以提供一种方法,但除非我错过了它,否则它似乎没有。

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

【问题讨论】:

  • 这里没有发生。您的代码可以正常工作
  • 该死。我以前很怕那个。我有时会连接我的 iPad 作为第二个屏幕。我最好检查一下对话框打开时没有幻屏。
  • 显示设置仅在 iPad 未连接时显示一台显示器,所以不是这样。尝试 Alt-Space 在对话窗口上打开系统菜单,但它为 LINQPad 本身打开。
  • 我会切换它。可能会解开一些东西。 :-)
  • 已修复。它在导致它的自己的进程中运行每个查询。关闭它,它工作正常。

标签: c# linqpad


【解决方案1】:

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

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

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

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

【讨论】:

  • 尝试在设置中启用“始终使用新的 appdomain”,看看是否有帮助。
  • 确实如此。谢谢。
  • 我发现这个设置在很多情况下都有问题,应该是每个程序的设置,而不是全局设置。
【解决方案2】:

不是解决方案,而是替代方案,FilePicker controle(新 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...");
    //...
}

【讨论】:

    【解决方案3】:

    我刚刚在使用 LINQPad 5 时遇到了这个问题。我需要一个类似于文件选择器的文件夹选择器。您的解决方案无需我修改 LINQPad5 设置即可工作。问题是对话框停留在后台。所以这就是我如何让你的 sn-p 与焦点对话一起工作。我没有使用 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 中初始化表单,但遇到了问题,因此我选择在显示对话框之前声明它。希望这可以帮助解决此问题的任何人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-02
      • 2015-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多