2012-04-02 21 views
1

私のアプリケーションでは、「開く」と「閉じる」という2つのボタンがあります。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

私はあなたがやっていることはお勧めしませんし、実際に私は本当にしないでくださいあなたがこのようなスレッドを使用することがあなたの(奇妙な)要件であると述べたので、実際の問題についてコメントします。

リストにスレッドを保存し、スレッドをこのリストから削除します。

編集:

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

あなたは、あなたが「開く」をクリックすると、開いているすべてのスレッドの記録を保持する必要があります。次に、 "Close"メソッドのループで、それぞれのリストを閉じます。

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(); 
    } 
} 

それはあなたのアプリケーションの「通常」のワークフローであれば、スレッドの強制終了が推奨されていない、つまり、ウィンドウが閉じられていませんでしたいくつかの重大なエラーのため

関連する問題