2016-11-09 98 views
1

如果我是2所形成(或更多)之間進行導航的正確方法,這將是這樣的:導航在C#的形式(分層/內容驅動的導航)

主菜單到第二形式:

Form2 form2 = new Form2(this) // Instantiate form and pass form data to next form 
Hide(); 

第二種形式:

Form1 form; 

public Form2(Form1 form1) 
{ 
    this.form1 = form1; //Take in previous form's data 
} 

向前導航將Hide()的CURR在向後導航的情況下將以當前形式Close()

但是,如果我處於第3,第4 ...第n格,並且希望返回主菜單,該怎麼辦?是否有某種方式來關閉所有隱藏的表單?

或者是否有適當的方法來瀏覽窗體?

+2

也許[MDI](https://msdn.microsoft.com/en -us/library/xyhh2e7e(v = vs.110).aspx)會是更好的方法嗎? – Groo

+0

@Groo有趣的,但我的應用程序不需要任何menustrips或toolstrips。 – iamhx

回答

0

我會從第一種形式的數據創建視圖模型,然後在第二種形式的方法中提供它。

public class Form1ViewModel { 
    public int Age {get; set;} 
    public string Name {get; set;} 
} 
//method on Form1 
public void NavigateToForm2() 
{ 
    var vm = new Form1ViewModel{ Age = 32, Name = "Test name"}; 
    var form2 = new Form2(); 
    form2.SetViewModel(vm); 
    form2.Show(); 
} 

同樣要關閉窗體看看這個link

我建議看看MVVM模式,因爲它處理導航,窗體(視圖)的實例化。開始的圖書館是mvvmfx。還有其他MVVM庫。

+0

MVVM是最好的方法,但是您將需要一些用於WinForms的框架,因爲它是設計。 WPF非常好地介紹了這種模式。但是,謝謝@Mihail Stancescu我會看看你的命名框架。 – Sebi

1

在我看來,你應該使用接口來改變表單之間的數據。這讓你保持更獨立,你的Form2只是獲得它需要的數據。例如:

public interface IForm1 //You should find better naming 
{ 
    void Edit(); //Method for edit some data 
    List<T> DataList {get;} //List with some relevant data 
} 

public Form Form1 : IForm1 
{ 
    public void Edit(){ //Your edit logic} 
    public List<T> DataList {get{return myGrid.DataSource as List<T>;}} 
} 

public Form Form2 
{ 
    private IForm1 formData; 

    public Form2(IForm1 formData) 
    { 
    formData = formData; 
    } 
} 

此外,我會考慮你的想法有這麼多的形式。我認爲一個帶有TabControl作爲第一個元素的MainForm在許多情況下是更好的選擇。您可以爲每個TabPage創建一個UserControl,並切換TabPage,而不是隨時彈出窗體。

UPDATE

enter image description here

此圖片也許澄清我的意思。 TabPageHeader都是不可見的(在圖像中,我可以看到它的澄清)。如果登錄成功,您只需切換TabPage。 TabControl.SelectedTabPage = tabPageMainScreen;

所以感覺對用戶更流暢,而且你沒有描述的問題。但我會建議通過不同的用戶控件分開窗體,以保持簡單。

更新2

在的WinForms,你可以隱藏TabHeader在本post建議。 例子:

tabControl.ItemSize = new Size(0, 1); 
tabControl.SizeMode = TabSizeMode.Fixed; 

這是一個有點難看,默認的TabControl不具有正規的方式,但它工作正常。

+0

我需要很多形式的原因是我的測試項目包含一個巨大的故事板。看看我的故事板的一小部分在這裏http://imgur.com/a/NbPxv – iamhx

+0

@Kuyo你也可以使用TabControl爲你的目的一個窗體。只需設置所有的TabPages.Visible = false並只顯示你想要的。這將禁用窗體的永久彈出。如果你想要大量的表單解決方案,我更喜歡一個MainForm,它通過ShowDialog()打開另一個表單並獲得結果。 – Sebi

+0

有趣。稍後我會試一試。 :) – iamhx

0

雖然Sebi和Mihail爲正確導航提供了很好的方法,但我自己做了一些練習並找到了幾種解決方案。

正如Sebi提到的那樣,帶有一個主要形式的TabControl在許多情況下是更好的方式,因爲它更流暢,沒有任何形式出現。

另一種方式是隻保留你的父母的實例(主)形式:

從子窗體到另一個導航將通過您的數據的父窗體和值(如果需要),閉幕前表單(一旦關閉,創建的所有資源都將被處理)。

但是,在某些情況下,如果您需要維護之前子窗體的值(因此,所有用戶輸入都不需要再次輸入),您還必須傳遞子窗體並隱藏它,而不是關閉它。當我打開的問題是,我有這樣的困惑我

一件事最初以爲在形式向前導航應該總是使用Hide();,而不是Close();

要關閉所有形式除主要形式(可能是爲那些誰也有類似的設計理念,爲礦井有用):

List<string> currentform = new List<string>(); 

foreach (Form form in Application.OpenForms) 
{ 
    if (form.Name != "Form1") 
    { 
     currentform.Add(form.Name); 
    } 
} 

foreach (string formName in currentform) 
{ 
    Application.OpenForms[formName].Close(); 
}