我有两个表单,我的主表单是Form1,我的辅助表单是按需显示的,因为对话框是Form2。 现在,如果我调用Form2,它将始终显示在屏幕的左上角。我第一次认为我的表格根本不存在,但后来我看到它悬挂在屏幕的上方。我想在当前鼠标位置显示我的表单,用户单击上下文菜单以显示模式对话框。 我已经尝试过不同的东西并搜索代码示例。但是我发现除了数以千计的不同代码之外什么都没有找到我已经知道的不同方式的实际鼠标位置。但无论如何,这个位置总是相对于屏幕,主要形式,控制或任何当前上下文。在这里我的代码(我也试过的桌面定位不起作用,中心到屏幕只有表单中心,所以我把属性留给了Windows.Default.Position):
Form2 frm2 = new Form2();
frm2.textBox1.Text = listView1.ToString();
frm2.textBox1.Tag = RenameFile;
DialogResult dlgres=frm2.ShowDialog(this);
frm2.SetDesktopLocation(Cursor.Position.X, Cursor.Position.Y);
答案 0 :(得分:10)
您的问题是您的第一个电话:frm2.ShowDialog(this);
然后调用frm2.SetDesktopLocation
,实际上只有在表单(frm2)已经关闭后才会调用它。
ShowDialog 是一个阻塞调用 - 意味着它仅在您调用ShowDialog的窗体关闭时返回。因此,您需要一种不同的方法来设置表单位置。
实现这一目标的最简单方法可能是在Form2上创建第二个构造函数(您想要定位),它为X和Y坐标提供两个参数。
public class Form2
{
// add this code after the class' default constructor
private int desiredStartLocationX;
private int desiredStartLocationY;
public Form2(int x, int y)
: this()
{
// here store the value for x & y into instance variables
this.desiredStartLocationX = x;
this.desiredStartLocationY = y;
Load += new EventHandler(Form2_Load);
}
private void Form2_Load(object sender, System.EventArgs e)
{
this.SetDesktopLocation(desiredStartLocationX, desiredStartLocationY);
}
然后,当您创建表单以显示它时,请使用此构造函数而不是默认构造函数:
Form2 frm2 = new Form2(Cursor.Position.X, Cursor.Position.Y);
frm2.textBox1.Text = listView1.ToString();
frm2.textBox1.Tag = RenameFile;
DialogResult dlgres=frm2.ShowDialog(this);
您也可以尝试在加载处理程序中使用this.Move(...)' instead of 'this.SetDesktopLocation
。
答案 1 :(得分:2)
你需要在ShowDialog()方法之前调用SetDesktopLocation,如下所示:
using(Form2 frm2 = new Form2())
{
frm2.textBox1.Text = listView1.ToString();
frm2.textBox1.Tag = RenameFile;
frm2.SetDesktopLocation(Cursor.Position.X, Cursor.Position.Y);
DialogResult dlgres=frm2.ShowDialog(this);
}
使用使用状态,重新编写。祝你好运;)