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

12 浏览
0 Comments

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

我正试图使用FolderBrowserDialog,正如在这里提到的那样:

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

如果我在按钮被按下时调用对话框,它就可以正常工作。但是我想在我的代码中间打开对话框(有一个通过套接字传入的文件,因此在接收它和保存它之间,我尝试获取保存路径),但它就是无法打开。

这是调用它的代码部分:

 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();

我应该如何尝试打开对话框以使其工作?

admin 更改状态以发布 2023年5月23日
0
0 Comments

因为您正在接收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

0
0 Comments

正如其他人所说,当您尝试调用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();

0