1

我在显示FolderBrowserDialog从非 UI 线程创建和调用的实例时遇到问题。它无法正确渲染。

更具体地说,它不显示文件夹树,而只显示Make New Folder OKCancel

替代文字

4

2 回答 2

3

所有 shell 对话框,包括 FolderBrowserDialog,都需要 COM 单元才能将线程设置为 STA。您可能缺少 Thread.SetApartmentState() 调用:

    private void button1_Click(object sender, EventArgs e) {
        var t = new Thread(() => new FolderBrowserDialog().ShowDialog());
        t.IsBackground = true;
        t.SetApartmentState(ApartmentState.STA);
        t.Start();
    }

请注意,您不能设置对话框的所有者,它很容易在另一个应用程序的窗口后面丢失。这使得在工作线程上显示表单或对话框不是一个好主意。

于 2010-05-31T15:31:08.550 回答
2

我不确定你为什么要这样做。在工作线程上,您的计算所需的所有值都应该可用。不需要用户交互来获得更多输入。
也许重新设计对您的情况更有帮助。考虑在启动之前将所选文件夹提供给您的工作线程。

编辑(回复评论):
如果你想做一些记录,我的回答仍然适用。您的工作线程应该知道在哪里记录异常,而不是开始询问用户。
你使用日志框架吗?如果没有,例如看看log4net。在这里,您通常会在 xml 文件中预先配置日志记录(日志级别、路径、格式……)。不需要用户交互。尽管用户可以更改日志记录路径(在 xml 文件中)。

于 2010-05-31T10:41:30.707 回答