我正在尝试完成我的静态Prompt类,以便能够从任何地方调用它。但是问题是无法显示对话框。我已经在使用[STAThread]
,这是我的代码。
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
上课的时候打电话
谢谢您的帮助。
当您没有例外时,它肯定可以正常工作。但是,是的,您看不到对话框的可能性相当大。非常难看的问题,您也没有任务栏按钮。找到它的唯一方法是最小化桌面上的其他窗口。
对话框(任何对话框)必须具有所有者窗口。您应该将该所有者传递给ShowDialog(owner)方法重载。如果您未指定,它将自行寻找所有者。底层调用是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()。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句