2015-09-07 85 views
2

我想完成我的靜態提示類能夠從任何地方調用它。但問題是無法使對話框顯示。我已經在使用[STAThread],這裏是我的代碼。C#OpenFileDialog線程啓動,但沒有顯示對話框

public static string ShowFileDialog() 
{ 
    string selectedPath = ""; 
    var t = new Thread((ThreadStart)(() => 
    { 
     FolderBrowserDialog fbd = new FolderBrowserDialog(); 
     fbd.RootFolder = System.Environment.SpecialFolder.MyComputer; 
     fbd.ShowNewFolderButton = true; 
     if (fbd.ShowDialog() == DialogResult.OK) 
     { 
      selectedPath = fbd.SelectedPath; 
     } 
    })); 
    t.SetApartmentState(ApartmentState.STA); 
    t.Start(); 

    t.Join(); 
    return selectedPath; 
} 

public static class Prompt是我的提示類。我打電話給public partial class Dashboard : Form

謝謝你的幫助。

+0

當對話框不可見時,能否描述一下使用ShowFileDialog()的用例?它可能是它是可見的但不是重點? –

+0

我只想在系統收到來自套接字的命令時詢問用戶文件的路徑。 –

+0

你從哪裏調用ShowFileDialog()? – Akansha

回答

5

當你沒有發生異常時,它肯定會正常工作。但是,是的,你沒有看到對話的相當不錯的可能性。很醜陋的問題,你也沒有任務欄按鈕。只有通過最小化桌面上的其他窗口才能找回它。

一個對話框,任何對話框,必須有一個所有者窗口。您應該將該所有者傳遞給ShowDialog(所有者)方法重載。如果你沒有指定它自己尋找所有者。底層的調用是GetActiveWindow()。沒有任何東西,桌面窗口現在成爲所有者。這不足以確保對話窗口在前面。

至少你必須創建所有者窗口,你現在至少有任務欄按鈕。就像這樣:

using (var owner = new Form() { Width = 0, Height = 0, 
     StartPosition = FormStartPosition.CenterScreen, 
     Text = "Browse for Folder"}) { 
     owner.Show(); 
     owner.BringToFront(); 
     FolderBrowserDialog fbd = new FolderBrowserDialog(); 
     fbd.RootFolder = System.Environment.SpecialFolder.MyComputer; 
     fbd.ShowNewFolderButton = true; 
     if (fbd.ShowDialog(owner) == DialogResult.OK) { 
      selectedPath = fbd.SelectedPath; 
     } 
    } 

仍然無法保證該對話框中是可見的,你不能把一個窗口到用戶的臉,當他與其他窗口交互。但至少有一個任務欄按鈕。

,我會很猶豫地顯示周圍的黑客,不使用它:

owner.Show(); 
    var pid = System.Diagnostics.Process.GetCurrentProcess().Id; 
    Microsoft.VisualBasic.Interaction.AppActivate(pid); 

正確的方法吸引用戶的注意力,並讓他與你的UI交互是NotifyIcon.ShowBalloonTip() 。

相關問題