2

我有一个自定义消息框(基本上是一个 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 子句;问题是我不知道如何从变量中获取表单实例或表单的 IWin32Window 句柄type。我可以做些什么来获取类的实例本身而不是类型

一个大编辑:抱歉,这是我犯的一个大错误,我说获取父表单的引用是将子表单居中。我需要在 MsqBox 实例中处理父表单的句柄,因为它也可以做其他事情。简而言之,我需要子表单中的父表单,而没有传递父表单的引用。可能吗?

4

3 回答 3

3

您可以尝试将 MessageBox 放在Form.ActiveForm上。

于 2012-09-21T18:07:10.477 回答
1

解决方案:

  • Form Parent { get; private set; }在每个MsgBox类实例中保留私有属性。
  • 创建将选择的MsgBox.ActiveForm { get { .. } } 静态Form.ActiveForm属性,如果它是类型,MsgBox则返回它的父级。

类的静态属性MsgBox

public static Form ActiveForm
{
    get
    {
        return Form.ActiveForm == null ? null :
            Form.ActiveForm is MsgBox ? ((MsgBox)Form.ActiveForm).Parent :
            Form.ActiveForm;
    }
}
于 2012-09-25T09:34:35.653 回答
0

这是一种方法,谢谢@Joe:

public static Form GetLastForm()
{
    if (Form.ActiveForm != null && !(Form.ActiveForm is MsgBox))
        return Form.ActiveForm;

    var openForms = Application.OpenForms.Cast<Form>().Where(f => !(f is MsgBox));
    if (openForms.Count > 0)
        return openForms[openForms.Count - 1];

    return null;
}

我在通过堆栈跟踪方法获取正确的父表单时遇到问题。这里基本的混淆是确定我是否想要当前活动的表单,或者最后打开的表单,或者导致 MsgBox 弹出的表单。这三个都可以不同,我采用堆栈跟踪方法以获得第三个。取决于堆栈跟踪令人沮丧。我现在才得到活动表格,如果没有,我会检索最后打开的表格。Application.OpenForms以完全正确的订单形式打开表格。

于 2012-09-25T09:23:57.147 回答