如何关闭WPF中所有打开的表单

如何关闭WPF中所有打开的表单,wpf,Wpf,在我的应用程序中,我有两个按钮“打开”和“关闭” 当我单击“打开”按钮时,窗口将打开;当我单击“关闭”按钮时,窗口将关闭 当我单击打开按钮3次时,将打开3个窗口。我想在单击“关闭”按钮时关闭所有窗口 这是我的代码[请不要尝试更改线程,因为这是我在应用程序中的要求] public partial class MainWindow : Window { Window ProgressWindow; Thread ProgressThread; public MainWindo

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

当我单击“打开”按钮时,窗口将打开;当我单击“关闭”按钮时,窗口将关闭

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

我不推荐您正在做的事情,实际上我也不知道它是否能像这样工作,但既然您说这样使用线程是您的(奇怪的)要求,我只对实际问题进行评论:

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

编辑:

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(); 
            }
        }  
    } 
} 
公共部分类主窗口:窗口
{ 
窗口进程窗口;
List ProgressThreads=new List();
公共主窗口()
{ 
初始化组件();
} 
私有无效打开\单击(对象发送者,路由目标e)
{ 
ProgressThreads.Add(新线程(()=>
{ 
ProgressWindow=新窗口();
ProgressWindow.Margin=新厚度(0,0,50,0);
ProgressWindow.WindowsState=WindowsState.Normal;
ProgressWindow.WindowsStartUpLocation=WindowsStartUpLocation.CenterScreen;
高度=180;
窗宽=180;
ProgressWindow.Content=“Hello WPF”;
ProgressWindow.ShowInTaskbar=false;
ProgressWindow.Show();
ProgressWindow.Closed+=(发送者2,e2)=>
ProgressWindow.Dispatcher.InvokeShutdown();
System.Windows.Threading.Dispatcher.Run();
})); 
ProgressThread.SetApartmentState(ApartmentState.STA);
ProgressThread.Start();
} 
私有无效关闭\单击(对象发送者,路由目标)
{ 
foreach(ProgressThreads中的var ProgressThread)
{
if(ProgressThread.IsAlive==true)
{ 
ProgressThread.Abort();
}
}  
} 
} 

我不推荐您正在做的事情,实际上我也不知道它是否能像这样工作,但既然您说这样使用线程是您的(奇怪的)要求,我只对实际问题进行评论:

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

编辑:

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(); 
            }
        }  
    } 
} 
公共部分类主窗口:窗口
{ 
窗口进程窗口;
List ProgressThreads=new List();
公共主窗口()
{ 
初始化组件();
} 
私有无效打开\单击(对象发送者,路由目标e)
{ 
ProgressThreads.Add(新线程(()=>
{ 
ProgressWindow=新窗口();
ProgressWindow.Margin=新厚度(0,0,50,0);
ProgressWindow.WindowsState=WindowsState.Normal;
ProgressWindow.WindowsStartUpLocation=WindowsStartUpLocation.CenterScreen;
高度=180;
窗宽=180;
ProgressWindow.Content=“Hello WPF”;
ProgressWindow.ShowInTaskbar=false;
ProgressWindow.Show();
ProgressWindow.Closed+=(发送者2,e2)=>
ProgressWindow.Dispatcher.InvokeShutdown();
System.Windows.Threading.Dispatcher.Run();
})); 
ProgressThread.SetApartmentState(ApartmentState.STA);
ProgressThread.Start();
} 
私有无效关闭\单击(对象发送者,路由目标)
{ 
foreach(ProgressThreads中的var ProgressThread)
{
if(ProgressThread.IsAlive==true)
{ 
ProgressThread.Abort();
}
}  
} 
} 

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

成员变量:

List<Thread> allThreads = new List<Thread>();
然后,关闭处理程序变为:

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

你所尝试的是非正统的,不用说。

当你点击“打开”时,你需要保存一份你打开的所有线程的记录。然后,在“关闭”方法中,在列表上循环关闭每个列表

成员变量:

List<Thread> allThreads = new List<Thread>();
然后,关闭处理程序变为:

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

您尝试的是非正统的,不用说。

我建议存储对已创建窗口的引用,您的代码可以如下所示:

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();
    }
}
Stack ProgressWindow=新堆栈();
线程进程线程;
私有无效打开\单击(对象发送者,路由目标e)
{
ProgressThread=新线程(()=>
{
var窗口=新窗口();
窗口边距=新厚度(0,0,50,0);
window.WindowState=WindowState.Normal;
window.WindowStartupLocation=WindowStartupLocation.CenterScreen;
窗高=180;
窗宽=180;
window.Content=“Hello WPF”;
window.ShowInTaskbar=false;
window.Show();
窗口关闭+=(发送者2,e2)=>
window.Dispatcher.InvokeShutdown();
ProgressWindow.Push(窗口);
System.Windows.Threading.Dispatcher.Run();
});
ProgressThread.SetApartmentState(ApartmentState.STA);
ProgressThread.Start();
}
私有无效关闭\单击(对象发送者,路由目标)
{
而(ProgressWindow.Count>0)
{
ProgressWindow.Pop().Close();
}
}

如果线程中止是应用程序的“正常”工作流,即由于某些严重错误窗口未关闭,则不建议线程中止。我建议存储对已创建窗口的引用,您的代码可能如下所示:

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();
    }
}
Stack ProgressWindow=新堆栈();
线程进程线程;
私有无效打开\单击(对象发送者,路由目标e)
{
ProgressThread=新线程(()=>
{
var窗口=新窗口();
窗口边距=新厚度(0,