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