2012-10-24 84 views
6

我最近一直在研究Android,並試圖將其功能之一移植到C#Compact Framework。試圖在下一個關閉窗體後顯示在C#cf

我所做的是創建一個抽象類,我稱其爲Activity。 這個類看起來像這樣

internal abstract class Activity 
    { 
     protected Form myForm; 
     private static Activity myCurrentActivity = null; 
     private static Activity myNextActivity = null; 

     internal static void LoadNext(Activity nextActivity) 
     { 
     myNextActivity = nextActivity; 
     if (myNextActivity != null) 
     { 
      myNextActivity.Show(); 
      if (myCurrentActivity != null) 
      { 
       myCurrentActivity.Close(); 
       myCurrentActivity = null; 
      } 
      myCurrentActivity = myNextActivity; 
      myNextActivity = null; 
     } 
     } 

     internal void Show() 
     { 
     //PROBLEM IS HERE 
     Application.Run(myForm); 
     //myForm.Show(); 
     //myForm.ShowDialog(); 
     // 
     } 

     internal void Close() 
     { 
     myForm.Close(); 
     } 


     internal void GenerateForm() 
     { 
     ///Code that uses the Layout class to create a form, and then stores it in myForm 
     //then attaches click handlers on all the clickable controls in the form 
     //it is besides the point in this problem 
     } 

     protected abstract void Click(Control control); 
     //this receives all the click events from all the controls in the form 
     //it is besides the point in this problem 

    } 

我的問題是與運行Show()命令

基本上所有我的類實現上面的類的一部分,加載XML文件並顯示它。 當我想過渡到一個新的類/形式(例如去從ACMain到ACLogIn) 我使用此代碼

Activity.LoadNext(new ACLogIn); 

這是應該載入一個表格,顯示它和卸載當前表單

我曾嘗試這些解決方案(在Show()方法),這裏是用myForm.ShowDialog() 每一個

  1. 問題0該工作,但塊執行的,這意味着舊的形式不緊密,並且更我的表單之間移動使用myForm.Show()
    這工作越進程堆棧增加

  2. ,關閉之後的舊錶舊的顯示,但關閉的程序和終止後立即使用

  3. Application.Run(myForm)
    這僅適用第一種形式的加載,當我移動到下一個形式,它顯示那麼它拋出一個異常說「價值不在預期範圍內「

有人可以幫我解決這個問題或找到替代方案嗎?

+1

主要問題是您只能有1個主窗體。看看Aplication是否有可寫的MainForm屬性,然後用Show()來使用它。 –

回答

5

如果您真的在創建自己的導航框架之後,您需要重新思考。傳遞到Application.Run的表單實例絕不能關閉 - 當它結束時,Application.Run將結束執行,並且(典型情況下)您的入口點退出並且應用程序終止。

什麼我建議是,你改變你的活動要麼是一個用戶控件:

public abstract class Activity : UserControl 
{ 
    .... 
} 

或撰寫一個

public abstract class Activity 
{ 
    private UserControl m_control; 
    .... 
} 

然後,而不是關閉和展示形式,家長所有的主窗體內的活動作爲容器。

作爲公正的警告,當您開始想要以Tab模式而不是堆棧或分割視圖顯示內容時,這會變得複雜。框架似乎很容易創建,但他們不是這樣,所以我至少會考慮使用已經完成的事情,除非您有令人信服的理由想要推出自己的產品。

+0

這個想法我的朋友,其實很棒,它讓我感到非常愚蠢,因爲沒有想過它,它可能實際上比我在關閉下一個之前打開一個新窗體的想法更好 – Cruces

+0

我已經對我的所有必要的更改項目爲了納入你的想法 我現在只顯示一種形式,並添加一個面板(我去面板),而不是一個窗體(因爲我說我使用緊湊的框架,所以這裏有點奇怪)並且在添加它之後,我刪除舊的並且它完美地工作,處理堆棧總是空的,並且進一步地,加載時間減半。 再次萬分感謝。現在我怎麼能給你一個bazzilion明星?嗯我會弄清楚(: – Cruces

1

Application.Run通常用於需要Form參數的過載。這將是負責啓動/顯示其他表格的「主要」形式。這種「主要」形式可能是「隱藏的」。但是,我認爲這有點尷尬。

或者,您不需要需要一個主窗體,您可以使用Application.Run()啓動一個消息泵來處理Windows消息;但是,線程正忙於處理消息,並且無法顯示對話框(它們必須顯示在正在運行Application.Run的線程中)。您可以調用Application.Run這些表單對象可以創建一個Timer對象,以便爲形式調用Run後表明會打電話Form.Show()Form.ShowDialog()Timer.Tick事件處理程序之前解決這個問題通過創建一個或多個表單對象。我認爲這也有點尷尬。

這兩種解決方案都可以規避您希望使用Windows和WinForms的方式;所以,我認爲你需要考慮重新設計這個應用程序以使用Windows和.NET的工作方式。

相關問題