2011-01-06 29 views
1

我有一个Windows窗体应用程序,它包含窗体类(及其设计器类)和一个静态类。我希望能够通过从静态类调用表单类中的方法来隐藏表单。如何在静态上下文中隐藏Windows窗体表单?

隐藏方法如下:

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

     if (dlgResult == DialogResult.OK) 
     { 
      this.Hide(); 
     } 
    } 

的形式也不是一成不变的,所以我一直运行到的问题“这个”在静态情况下不是有效的。我想这样调用方法:

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

     if (CheckIfLaunched()) 
     { 
      InitAllFields(); 
     } 
     else 
     { 
      frmUavController.HideController(); 
     } 
    } 

我该怎么办?

+0

从HideController方法删除static修饰符,然后你就可以使用`this`关键字。 – Josh 2011-01-06 04:16:03

+0

@Josh Einstein,是的,但是我该如何静态调用该方法?我想引用已经实例化的表单对象。 – wulfgarpro 2011-01-06 04:20:23

+0

从你的例子看来,你看起来并不像你在静态调用它。无论如何,如果可能的话,避免使用作用于某个事物实例的静态方法。如果这是不可能的,那么在SO上寻找关于“Singleton”设计模式的信息。 – Josh 2011-01-06 04:23:03

回答

2

可以使用Form.ActiveForm静态属性来获取对窗体的引用。您必须将其转换为frmUavController才能调用您的HideController方法(从中删除静态修改器后)。

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

    if (dlgResult == DialogResult.OK) 
    { 
     this.Hide(); 
    } 
} 

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

    if (CheckIfLaunched()) 
    { 
     InitAllFields(); 
    } 
    else 
    { 
     // a safer cast is recommended 
     ((frmUavController)Form.ActiveForm).HideController(); 
    } 
} 
0

请尝试以下操作。创建一个属性,

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(); 
} 
相关问题