2014-10-07 65 views
0

我有兩個Windows。主窗口和自動導入。主要目標是在窗口之間切換,同時保持一個窗口處於活動狀態,而不是關閉窗口。我想要一個顯示,而另一個隱藏。我可以通過在另一個窗口中使用一個窗口來做到這一點。我遇到的唯一問題是啓動窗口是帶參數的窗口。我猜這需要是可選的?我不確定你如何用Window來做到這一點。使用可選參數初始化WPF窗口

當我的項目開始時,主窗口出現。代碼是

public partial class MainWindow : Window 
{ 
    private AutoImport auto; 

    public MainWindow(AutoImport parent) 
    { 
     InitializeComponent(); 
     auto = parent; 
    } 

    public void btnAutoImport_Click(object sender, RoutedEventArgs e) 
    { 
     this.Hide(); 
     auto.Show(); 
    } 
} 

如果我點擊按鈕,主窗口應該隱藏,並應出現其他窗口。代碼是

public AutoImport() 
{ 
    InitializeComponent(); 
} 

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    this.Hide(); 
    MainWindow main = new MainWindow(this); 
    main.Show();   
} 

變化然後可以做出AUTOIMPORT並單擊此窗體上的按鈕時,AUTOIMPORT會躲在一個新的主窗口將出現。如果再次單擊主窗口上的按鈕,AutoImport會提前更改。當我切換表單上的代碼時,我沒有遇到任何問題。

回答

2

做你問你可以只添加一個構造函數來主窗口:

public partial class MainWindow : Window 
{ 
    private AutoImport auto; 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    public MainWindow(AutoImport parent) 
    { 
     InitializeComponent(); 
     auto = parent; 
    } 

    public void btnAutoImport_Click(object sender, RoutedEventArgs e) 
    { 
     this.Hide(); 
     if (auto == null) { auto = new AutoImport(); } 
     auto.Show(); 
    } 
} 

雖然我認爲它可能會更有意義,以保持主窗口中AUTOIMPORT該實例的副本,因爲你只是躲在它。因此,當您創建一個MainWindow實例時,還可以創建一個AutoImport實例,將MainWindow設置爲AutoImport的屬性/字段。然後當你點擊按鈕時,窗口被交換。這樣你就不必每次都創建一個新的MainWindow。事情是這樣的:

public partial class MainWindow : Window 
{ 
    private AutoImport auto; 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    public MainWindow_Loaded(object sender, EventArgs e) 
    { 
     auto = new AutoImport(this); 
    } 

    public void btnAutoImport_Click(object sender, RoutedEventArgs e) 
    { 
     this.Hide(); 
     auto.Show(); 
    } 
} 

public class AutoImport 
{ 
    private Window LinkedWindow { get; set; } 
    public AutoImport(Window parent) 
    { 
     InitializeComponent(); 
     LinkedWindow = parent; 
    } 
    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     this.Hide(); 
     LinkedWindow.Show();   
    } 
} 
1

至於非默認構造函數去....

除了默認構造函數中添加這一項:

public MainWindow(AutoImport parent) : this() 
{ 
    auto = parent; 
} 

: this()將確保默認的構造函數運行,其中包含InitializeComponent(),這樣你就不會複製代碼。

關於你的設計方法的話題,如果你不打算使用MVVM路由,那麼我會創建一些窗口管理器類來處理內存中的窗口以及它們的狀態。通過對兩個窗口進行雙向控制以控制誰顯示以及誰隱藏,您將創建非常緊密的耦合,並且任何更改都將成爲大量工作。我說讓第三方(另一個班級)處理這種事情。爲什麼一個窗口應該知道另一個窗口的存在?如果經理正在處理所有工作或中繼數據,而另一位經理正在處理狀態,那麼窗口本身只需關心他們的工作。想想他們的責任......他們應該知道什麼以及他們應該做什麼......當然不是另一個窗口的狀態(在我看來)。

請注意,我不知道您的應用程序的全部範圍,所以也許您的解決方案將解決它只是沒有過度工程的東西。我遇到了一個需要非常基本設置的案例,所以我只是爲每個窗口添加了一個靜態屬性。我有該屬性在創建後保存窗口的實例(在構造函數中完成)。如果當我試圖檢查屬性時沒有實例被實例化,則由屬性創建一個實例。基本上,一個單身實施。所以,每當另一個窗口需要訪問某個窗口時,只需要調用SomeWindow.Instance.Show(),窗口就會出現。如果沒有以前的實例,則會創建並顯示一個實例。我允許財產處理所有知道該窗口是否已經在內存中的骯髒工作。這也使我能夠訪問他們的數據。非常黑客的方式,但它是完美的這種簡單的情況。

這是關於編程的奇妙之處 - 問題可以通過無限的方式解決。