我正在尝试使用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才能使用?
答案 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