c# - 有没有办法从调用堆栈中获取最后一个表单类?

标签 c# winforms types instance callstack

我有一个自定义消息框(基本上是一个 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/

相关文章:

c# - 使用 FakeItEasy 伪造 WCF 服务调用

c# - 您将如何允许程序仅安装在特定计算机上

c# - Process.Start ("explorer.exe");不会带回任务栏

c# - C# Generics 中的 "default"类型参数是否有合理的方法?

memory - Rust 如何在运行时存储类型?

c# - 将 C# 类转换为具有自定义结构的 Json

c# - 在功能列表操作中,我们怎么称呼 "inserting something between each item"?

c# - 如何为 MSChart 创建多种颜色/系列

C# ListView 图片图标大小

python - python 中的简单类型与复杂类型?