2013-05-28 70 views
0

我有以下任務。從C#中的前景窗體關閉背景窗體wpf

步驟:

A型按鈕

預期的點擊打開表格B:

表格B開始,形成一個閉合。

結果:

表格B開始,但表格A仍保留在背景中。

我試圖通過將Form A的引用傳遞給Form B來解決問題,但它奇怪地不起作用。

Form A :(MainWindow)

AdminWindow window = new AdminWindow(); 
window.setCreatingForm = this; 
window.Show(); 

Form B(AdminWindow)

public Window setCreatingForm 
{ 
    get { return creatingForm; } 
    set { creatingForm = value; } 
} 

public Window creatingForm { get; set; } 

private void logOutClick(object sender, RoutedEventArgs e) 
{ 
    if (creatingForm != null) 
     creatingForm.Close(); `// Why does this not close the background Form` 
    MainWindow window = new MainWindow(); 
    window.Show(); 
} 

回答

1

設置父窗體的Visible屬性設置爲false。

 public Form1() 
     { 
      InitializeComponent();   
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      var form = new Form2(); 
      form.Show(); 
      this.Visible = false; 
     } 
+0

這是一個正常的WIndows窗體。我意識到WPF中沒有「可見」屬性。不過,我明白了你的想法,並發現WPF中的等價屬性。它被稱爲「隱藏」,而不是這個。可見我需要這樣做。隱藏。謝謝 ! – rockstar

2

我沒有太多的經驗與WPF,但基於從Windows窗體的一個,我覺得這是最簡單的關閉形成起始B型後,立即:

// form A code for launching B 
AdminWindow window = new AdminWindow(); 
window.setCreatingForm = this; 
window.Show(); 
this.Close(); 

的上面應該工作,因爲啓動形式B的方法不會在調用window.Show()之後退出或阻塞。只有在顯示一個模式窗口時纔會調用該窗口(在使用window.ShowDialog()完成Widows窗體中)。

至於爲什麼你的代碼中的Close()不起作用,它看起來像是在銷燬表單A之後,你正在創建並顯示一個相同類型的新表單,也許原始表單被關閉,但是你所看到的是新創建的一個。

PS:包含set或獲得.Net屬性的名稱是一種不好的做法。 set和get行爲是通過定義屬性的set和get方法來添加的。因此,在您的AdminWindow代碼中,創建表單的屬性應該被命名爲CreatingForm而不是setCreatingForm

+0

謝謝,我接受你的建議。我通過使用WPF Api「隱藏」來解決我的問題。所以這個.hide()在wpf是我正在尋找的。 +1的幫助。 – rockstar

+1

@rockstar,只要注意關閉和隱藏是兩回事。關閉不僅會從UI中刪除表單,還會清除與其關聯的所有資源。隱藏不執行清除部分,並且通常在以後需要重新顯示相同的表單實例(取消隱藏)時使用隱藏。如果您隱藏表單然後在再次顯示時創建新表單,則會浪費資源。 –