2015-09-07 87 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() 。

相关问题