C#如何在代码中间打开FolderBrowserDialog?

时间:2014-12-05 19:41:28

标签: c# .net wpf folderbrowserdialog

我正在尝试使用FolderBrowserDialog,因为它提到了here:

var dialog = new System.Windows.Forms.FolderBrowserDialog();
System.Windows.Forms.DialogResult result = dialog.ShowDialog();

如果在按下按钮时调用Dialog,它可以正常工作。但是我想在我的代码中间打开对话框(通过套接字有一个传入的文件,所以在接收它并保存它之间我尝试获取保存它的路径),它只是赢得了#t发生。

以下是代码的一部分:

 byte[] clientData = new byte[1024 * 5000];
 int receivedBytesLen = clientSocket.Receive(clientData);

 var dialog = new System.Windows.Forms.FolderBrowserDialog();
 System.Windows.Forms.DialogResult result = dialog.ShowDialog();
 string filePath = dialog.SelectedPath;

 int fileNameLen = BitConverter.ToInt32(clientData, 0);
 string fileName = Encoding.ASCII.GetString(clientData, 4, fileNameLen);
 BinaryWriter bWrite = new BinaryWriter(File.Open(filePath + "/" + fileName, FileMode.Append)); ;
 bWrite.Write(clientData, 4 + fileNameLen, receivedBytesLen - 4 - fileNameLen);
 bWrite.Close();

我应该如何尝试打开Dialog才能使用?

2 个答案:

答案 0 :(得分:2)

正如其他人所说,当你试图调用UI对话框时,你最有可能在一个单独的线程中。

在你发布的代码中,你可以使用WPF方法BeginInvoke和一个新的Action,它将强制在UI线程中调用FolderBrowserDialog。

        System.Windows.Forms.DialogResult result = new DialogResult();
        string filePath = string.Empty;
        var invoking = Application.Current.Dispatcher.BeginInvoke(new Action(() =>
        {
            var dialog = new System.Windows.Forms.FolderBrowserDialog();
            result = dialog.ShowDialog();
            filePath = dialog.SelectedPath;
        }));

        invoking.Wait();

如果要创建单独的线程,可以将ApartmentState设置为STA,这样您就可以调用UI对话框而无需调用。

        Thread testThread = new Thread(method);
        testThread.SetApartmentState(ApartmentState.STA);
        testThread.Start();

答案 1 :(得分:0)

因为您获得了STA异常,这意味着您可能正在后台线程上运行。

调用对话框的InvokeRequired / BeginInvoke模式:

if (InvokeRequired)
{
        // We're not in the UI thread, so we need to call BeginInvoke
        BeginInvoke(new MethodInvoker(ShowDialog)); // where ShowDialog is your method

}

见:http://www.yoda.arachsys.com/csharp/threads/winforms.shtml。 见:Single thread apartment issue