2012-04-02 44 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窗口由于一些严重错误

相关问题