C# 如何在静态上下文中隐藏Windows窗体?

C# 如何在静态上下文中隐藏Windows窗体?,c#,winforms,static-methods,C#,Winforms,Static Methods,我有一个Windows窗体应用程序,其中包括窗体类(及其设计器类)和静态类。我希望能够通过从静态类调用form类中的方法来隐藏表单 隐藏方法如下所示: internal static void HideController() { DialogResult dlgResult = MessageBox.Show("Controller will now close.", "Closing...",

我有一个Windows窗体应用程序,其中包括窗体类(及其设计器类)和静态类。我希望能够通过从静态类调用form类中的方法来隐藏表单

隐藏方法如下所示:

    internal static void HideController()
    {
        DialogResult dlgResult = 
            MessageBox.Show("Controller will now close.", "Closing...", 
                            MessageBoxButtons.OK, MessageBoxIcon.Warning);

        if (dlgResult == DialogResult.OK)
        {
            this.Hide();
        }
    }
表单不是静态的,因此我一直遇到“this”在静态上下文中无效的问题。我想这样调用该方法:

    static UtilScenario()
    {
        _stkProgramId = ConfigurationManager.AppSettings.Get("stkProgramId");

        if (CheckIfLaunched())
        {
            InitAllFields();
        }
        else
        {
            frmUavController.HideController();
        }
    }
我该怎么办?

您可以使用static属性获取对表单的引用。您必须将其强制转换为frmUavController,以便调用HideController方法(在移除静态修改器之后)


尝试以下方法。创建一个属性

public static Form frm { get; set; }

static void UtilScenario()
{
    HideController();
}

internal static void HideController()
{
    if (frm == null)
        return;
    DialogResult dlgResult = MessageBox.Show("Controller will now close.", "Closing...",
        MessageBoxButtons.OK, MessageBoxIcon.Warning);

    if (dlgResult == DialogResult.OK)
    {
        frm.Hide();
    }
}
你可以这样称呼它:

public void button2_Click(object sender, EventArgs e)
{
    Form1.frm = this;
    Form1.HideController();
}

从HideController方法中删除静态修饰符,然后您就可以使用
this
关键字了。@Josh Einstein,是的,但是如何静态调用该方法?我想引用已经实例化的表单对象。从您的示例来看,它不像是静态调用的。无论如何,如果可能的话,避免使用作用于某个实例的静态方法。如果这是不可能的,那么在SO上查找有关“Singleton”设计模式的信息。HideControl是在静态类中调用的,而不是在form类中调用的。form类不是静态的。我猜他指的是您应该检查form.ActiveForm是否是frmUavController。否则,您可能会在runtime@WolfgarPro它不进行类型检查以确保强制转换有效或有任何错误处理。如果以后添加更多表单,建议立即添加该保护。
public void button2_Click(object sender, EventArgs e)
{
    Form1.frm = this;
    Form1.HideController();
}