如何以动态创建的形式打开文件浏览器对话框?

时间:2013-11-25 09:53:29

标签: c# .net multithreading user-interface sta

我的应用程序中有两个表单,一个在设计时生成,另一个在运行时动态生成。在运行时生成的表单中有一个上下文菜单,其中有一个项目可以打开FolderBrowserDialog。无论何时,我试图点击该项目时出现错误

  Current thread must be set to single thread apartment (STA) mode before OLE  

  calls can be made. Ensure that your Main function has STAThreadAttribute  

  marked on it. This exception is only raised if a debugger is attached to the  

  process.

如其他问题所解释的上述问题的解决方案是将Main()方法标记为[STA Thread],但在我的情况下已经存在。那么,我该如何纠正这个问题呢? 我打电话给对话的方式是: -

    private void RightClickMenuClicked(object sender, ToolStripItemClickedEventArgs e)
    {
       if (e.ClickedItem.ToString() == "Copy")
        {
           FolderBrowsing.ShowDialog() ; 
           // Do other stuff here ....
        }
   }

2 个答案:

答案 0 :(得分:2)

在Windows窗体或WPF中,用户界面只能在单线程中运行。您必须使用Invoke方法将您的附加窗口调用Dispatcher括起来 - 这将强制UI线程处理它。 (凯尔的方法有点类似)

答案 1 :(得分:0)

我不知道你是如何调用ShowDialog方法的。您可以尝试以下代码

    private DialogResult STAShowDialog(FolderBrowserDialog dialog)
    {
        DialogState state = new DialogState();
        state.dialog = dialog;
        System.Threading.Thread t = new  
               System.Threading.Thread(state.ThreadProcShowDialog);
        t.SetApartmentState(System.Threading.ApartmentState.STA);
        t.Start();
        t.Join();
        return state.result;
    }

    public class DialogState
    {
      public DialogResult result;
      public FolderBrowserDialog dialog;


      public void ThreadProcShowDialog()
      {
        result = dialog.ShowDialog();
      }
    }

然后在按钮单击或某处可以尝试

     private void button1_Click(object sender, EventArgs e)
    {
        FolderBrowserDialog _myfolderDialog= new FolderBrowserDialog();
        frm.InitializeLifetimeService();


        DialogResult _result= STAShowDialog(_myfolderDialog);
        if (result== DialogResult.OK)
        {
            //Do your stuff
        }
    }