如何在 C# 中在代码中打开 FolderBrowserDialog?
如何在 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日
因为您正在接收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
正如其他人所说,当您尝试调用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();