【问题标题】:how to close all the open form in WPF如何关闭WPF中所有打开的表单
【发布时间】:2012-04-02 12:44:53
【问题描述】:

在我的应用程序中,我有两个按钮“打开”和“关闭”。

当我点击打开按钮时窗口会打开,当我点击关闭按钮时窗口会关闭。

当我点击打开按钮 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();
        } 
    }
}

【问题讨论】:

    标签: wpf


    【解决方案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();
        }
    }
    

    如果线程中止是应用程序的“正常”工作流程,即由于某些严重错误而未关闭窗口,则不建议使用线程中止

    【讨论】:

      【解决方案2】:

      我不会推荐你在做什么,实际上我真的不知道它是否像这样工作,但既然你说使用这样的线程是你的(奇怪的)要求,我只会评论实际问题:

      您应该将线程保存在一个列表中,然后关闭该列表中的所有线程。

      编辑:

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

      【讨论】:

        【解决方案3】:

        您需要记录您在单击“打开”时打开的所有线程。然后在你的“关闭”方法中循环关闭每个列表。

        成员变量:

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

        然后在你打开的处理程序中添加:

        allThreads.Add(ProgressThread);
        

        然后你的关闭处理程序变成:

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

        你所尝试的不正统应该是不言而喻的。

        【讨论】:

          猜你喜欢
          • 2014-01-06
          • 1970-01-01
          • 1970-01-01
          • 2021-01-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多