2011-01-06 27 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(); 
} 
相關問題