我有一个自定义消息框(基本上是一个 winform),它会在调用表单的中心上弹出,如下所示:
public partial class Form1 : Form
{
private void button1_Click(object sender, EventArgs e)
{
MsgBox.Show(this, "asdsdfsdf");
}
}
在这里,我将 this
(Form1) 作为 MsgBox
的所有者传递。现在我知道了 MsgBox 表单的位置,因为我还传递了父表单 (Form1
)。
但是我需要这个自定义消息框来对齐自身(中心到父窗体),即使从其他类调用,例如,
public class Computer
{
public void Do(int i)
{
MsgBox.Show(i.ToString());
}
}
这里的问题是我无法将父表单的引用传递给 MsgBox
类。所以在这里我将无法定位自定义框。我希望 MsgBox
类能够确定哪个是调用堆栈中的最后一个表单类?
我试过这个:
public partial class MsgBox : Form
{
private void X()
{
StackTrace df = new StackTrace();
foreach (var item in df.GetFrames())
{
var type = item.GetMethod().DeclaringType;
if (type.BaseType == typeof(Form))
{
IWin32Window w = //how to get the form instance here??
//------------
break;
}
}
}
}
我确实了解了内部的 if 子句;问题是我不知道如何从 type
变量获取表单实例或表单的 IWin32Window 句柄。我可以做些什么来获取实例类本身而不是类型?
大编辑:抱歉,我犯了一个很大的错误,我说获取父表单的引用是为了使子表单居中。我需要 MsqBox 实例中的父表单句柄,因为它也可以执行其他操作。简而言之,我需要子表单中的父表单,而无需传递父表单的引用。可能吗?
最佳答案
您可以尝试将 MessageBox 集中在 Form.ActiveForm 上.
关于c# - 有没有办法从调用堆栈中获取最后一个表单类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12535668/