C# 如果application.Current为NULL,如何获取所有活动wpf窗口(多线程)的集合?

C# 如果application.Current为NULL,如何获取所有活动wpf窗口(多线程)的集合?,c#,wpf,multithreading,C#,Wpf,Multithreading,在我的项目中,我通过编程在不同的线程中从类创建了两个wpf窗口。在其中一个wpf windows代码(xaml.cs)中,我希望使用System.windows.Application.Current.windows获取所有活动的wpf窗口,但System.windows.Application.Current为Null。我怎样才能得到这个集合?它真的有可能吗?如果出于任何原因在不同的线程上创建窗口,你应该自己跟踪它们。例如,您可以将它们添加到可以从所有线程访问的静态集合中,例如: public

在我的项目中,我通过编程在不同的线程中从类创建了两个wpf窗口。在其中一个wpf windows代码(xaml.cs)中,我希望使用
System.windows.Application.Current.windows
获取所有活动的wpf窗口,但
System.windows.Application.Current
Null
。我怎样才能得到这个集合?它真的有可能吗?

如果出于任何原因在不同的线程上创建窗口,你应该自己跟踪它们。例如,您可以将它们添加到可以从所有线程访问的静态集合中,例如:

public class ApplicationService
{
    private readonly List<Window> _windows = new List<Window>();

    public IEnumerable<Window> Windows => _windows;

    public void Add(Window window)
    {
        if (window == null)
            throw new ArgumentNullException(nameof(window));

        lock (_windows)
        {
            window.Closed += Window_Closed;
            _windows.Add(window);
        }
    }

    private void Window_Closed(object sender, EventArgs e)
    {
        Window window = (Window)sender;
        lock (_windows)
        {
            window.Closed -= Window_Closed;
            _windows.Remove(window);
        }
    }
}
公共类应用程序服务
{
私有只读列表_windows=new List();
公共IEnumerable窗口=>\u窗口;
公共作废添加(窗口)
{
如果(窗口==null)
抛出新ArgumentNullException(nameof(window));
锁定(_窗口)
{
window.Closed+=window\u Closed;
_添加(窗口);
}
}
私有无效窗口\u已关闭(对象发送方,事件参数e)
{
窗口=(窗口)发送方;
锁定(_窗口)
{
window.Closed-=window\u Closed;
_窗口。移除(窗口);
}
}
}

Application.Current.Windows
集合不跟踪在应用程序的dispatcher线程以外的任何其他线程上创建的窗口。

除非创建新的消息泵,否则您不能在不同的线程中创建不同的窗口。但是没有理由这么做。WPF应用程序通过在不同的线程上执行非UI操作,在单个UI线程上正常工作。您为什么要尝试从多个线程中删除windows?你想解决的实际问题是什么?当然有可能。只需切换到创建窗口的每个线程,并从该线程内部调用Application.Current.Windows。既然你不能在创建线程之外与这些窗口进行交互,你必须已经这样做了,对吗?可以将其视为以后为您保存一个Dispatcher调用。您可以在创建每个窗口时将对它们的引用添加到静态列表中。@mm8最好在创建每个窗口时跟踪应用程序实例,而不是复制窗口跟踪框架。