写了一个登录自定义对话框
static LoginDialog loginDialog;
public static bool ShowLoginDialog()
{
result = false; // Success
loginDialog = new LoginDialog();
loginDialog.ShowDialog();
loginDialog.BringToFront();
loginDialog.TopMost = true;
loginDialog.Activate();
return result;
}
我通过另一种形式从我的互动中称呼它,当计时器打勾时它会激活:
LoginDialog.ShowLoginDialog();
问题是登录屏幕没有集中在当前打开的表单之上。
我该如何解决这个问题?谢谢。
答案 0 :(得分:1)
在要获得焦点的表单中使用SetForegroundWindow
[DllImport("user32")]
public static extern int SetForegroundWindow(IntPtr hwnd);
当显示对话框表单时,使用表单句柄调用该函数;
void OnShown(object sender, EventArgs e) {
SetForegroundWindow(this.Handle);
}
答案 1 :(得分:1)
在loginDialog.TopMost = true;
loginDialog.ShowDialog();
为什么使用静态方法?我认为这是主要问题。
答案 2 :(得分:0)
//Suppose you have Form1 as your parent Form
//Add Button on it and on its Click Event
只需做:
public bool ShowLoginDialog()
{
bool result = false; // Success
var loginDialog = new LoginDialog();
loginDialog.ShowDialog();
return result;
}
ShowDialog()始终位于执行它的父窗体的顶部。
此致
答案 3 :(得分:0)
loginDialog.BringToFront();因为ShowDialog()阻止执行,所以不会调用它。 将所有者表单传递给ShowDialog。
答案 4 :(得分:0)
我假设你的LoginDialog
只是另一张表格。试试这个 -
在MainForm
:
private void MainForm_Load(object sender, EventArgs e)
{
timer1.Interval = 3000; // your preferred time-interval
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
LoginDialog.ShowLoginDialog(timer1);
}
在LoginDialog
:
private static bool result;
private static LoginDialog loginDialog;
public static bool ShowLoginDialog(Timer timer)
{
timer.Stop();
result = false; // Success
loginDialog = new LoginDialog();
loginDialog.ShowDialog();
return result;
}
注意:我不知道您使用的result
变量是什么。
答案 5 :(得分:0)
你说你是从另一种形式呼叫ShowLoginDialog()
。您可以将签名更改为public static bool ShowLoginDialog(Form parentForm)
或public static bool ShowLoginDialog(IWin32WindowOwner parentForm)
吗?如果是这样,那么你可以这样做:
public static bool ShowLoginDialog(IWin32WindowOwner parentForm)
{
using(LoginDialog loginDialog = new LoginDialog()) //Really should use using statement
{
loginDialog.ShowDialog(parentForm); //Set the parent form for the dialog
}
}