2012-04-02 43 views
1

在我的應用程序中,我有兩個按鈕「打開」和「關閉」。如何關閉WPF中的所有打開窗體

當我點擊打開按鈕窗口時會打開,當我點擊關閉按鈕窗口時會關閉。

當我點擊打開按鈕3次,3個窗口將被打開。當我點擊關閉按鈕時,我想關閉所有窗口。

這裏是我的代碼[請不要嘗試改變線,因爲這是在我的應用我的要求]

public partial class MainWindow : Window 
{ 
    Window ProgressWindow; 
    Thread ProgressThread; 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void Open_Click(object sender, RoutedEventArgs e) 
    { 
     ProgressThread = new Thread(() => 
     { 
      ProgressWindow = new Window(); 
      ProgressWindow.Margin = new Thickness(0, 0, 50, 0); 
      ProgressWindow.WindowState = WindowState.Normal; 
      ProgressWindow.WindowStartupLocation = WindowStartupLocation.CenterScreen; 
      ProgressWindow.Height = 180; 
      ProgressWindow.Width = 180; 
      ProgressWindow.Content = "Hello WPF"; 
      ProgressWindow.ShowInTaskbar = false; 
      ProgressWindow.Show(); 
      ProgressWindow.Closed += (sender2, e2) => 
      ProgressWindow.Dispatcher.InvokeShutdown(); 
      System.Windows.Threading.Dispatcher.Run(); 
     }); 
     ProgressThread.SetApartmentState(ApartmentState.STA); 
     ProgressThread.Start(); 
    } 

    private void Close_Click(object sender, RoutedEventArgs e) 
    { 
     if (ProgressThread.IsAlive == true) 
     { 
      ProgressThread.Abort(); 
     } 
    } 
} 

回答

0

我不建議你在做什麼,其實我真的不知道它是否像這樣工作,但既然你聲明使用這樣的線程是你的(奇怪的)要求,我只會對實際問題發表評論:

你應該將線程保存在List中,然後關閉所有線程從這個列表中。

編輯:

public partial class MainWindow : Window 
{ 
    Window ProgressWindow; 
    List<Thread> ProgressThreads = new List<Thread>(); 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void Open_Click(object sender, RoutedEventArgs e) 
    { 
     ProgressThreads.Add(new Thread(() => 
     { 
      ProgressWindow = new Window(); 
      ProgressWindow.Margin = new Thickness(0, 0, 50, 0); 
      ProgressWindow.WindowState = WindowState.Normal; 
      ProgressWindow.WindowStartupLocation = WindowStartupLocation.CenterScreen; 
      ProgressWindow.Height = 180; 
      ProgressWindow.Width = 180; 
      ProgressWindow.Content = "Hello WPF"; 
      ProgressWindow.ShowInTaskbar = false; 
      ProgressWindow.Show(); 
      ProgressWindow.Closed += (sender2, e2) => 
      ProgressWindow.Dispatcher.InvokeShutdown(); 
      System.Windows.Threading.Dispatcher.Run(); 
     })); 
     ProgressThread.SetApartmentState(ApartmentState.STA); 
     ProgressThread.Start(); 
    } 

    private void Close_Click(object sender, RoutedEventArgs e) 
    { 
     foreach(var ProgressThread in ProgressThreads) 
     { 
      if (ProgressThread.IsAlive == true) 
      { 
       ProgressThread.Abort(); 
      } 
     } 
    } 
} 
0

您將需要保持你已經打開,當你點擊「打開」的所有線程的記錄。然後在你的「關閉」方法循環結束每一個列表。

成員變量:

List<Thread> allThreads = new List<Thread>(); 

然後在打開的處理程序添加:

allThreads.Add(ProgressThread); 

然後你的親密處理變爲:

foreach (Thread thread in allThreads) 
{ 
    if (thread.IsAlive) 
    { 
     thread.Abort(); 
    } 
} 

那你正在嘗試是非正統應該去不用說。

1

我會推薦給引用存儲創建的窗口,你的代碼可以是這樣的:不建議

Stack<Window> ProgressWindow=new Stack<Window>(); 
Thread ProgressThread; 

private void Open_Click(object sender, RoutedEventArgs e) 
{ 
    ProgressThread = new Thread(() => 
    { 
     var window = new Window(); 
     window.Margin = new Thickness(0, 0, 50, 0); 
     window.WindowState = WindowState.Normal; 
     window.WindowStartupLocation = WindowStartupLocation.CenterScreen; 
     window.Height = 180; 
     window.Width = 180; 
     window.Content = "Hello WPF"; 
     window.ShowInTaskbar = false; 
     window.Show(); 
     window.Closed += (sender2, e2) => 
     window.Dispatcher.InvokeShutdown(); 
     ProgressWindow.Push(window); 
     System.Windows.Threading.Dispatcher.Run(); 
    }); 
    ProgressThread.SetApartmentState(ApartmentState.STA); 
    ProgressThread.Start(); 
} 

private void Close_Click(object sender, RoutedEventArgs e) 
{ 
    while (ProgressWindow.Count > 0) 
    { 
     ProgressWindow.Pop().Close(); 
    } 
} 

線程終止執行,如果它是「正常」的應用程序的工作流程,沒有關閉IE窗口由於一些嚴重錯誤

相關問題