Avalonia 获取所有窗口
Posted
技术标签:
【中文标题】Avalonia 获取所有窗口【英文标题】:Avalonia Get All Windows 【发布时间】:2022-01-11 23:48:46 【问题描述】:有没有办法获取 Avalonia 中所有窗口的列表?
WPF 中的 this 等价物
Application.Current.Windows
我的要求是根据其DataContext激活或关闭某个窗口。
如果我无法访问这样的列表;有没有办法跟踪窗口的创建和销毁以创建内部列表?
【问题讨论】:
【参考方案1】:您可以像这样使用类型为List<Window>
的static
属性创建WindowsManagerClass
public class WindowsManager
public static List<Window> AllWindows = new List<Window>();
并在您的 Form 构造函数中像此代码一样添加到 AllWindows
public MainWindow()
InitializeComponent();
WindowsManager.AllWindows.Add(this);
您可以在需要的地方访问这样的参考
var allwindows = WindowsManager.AllWindows;
var selectedWindows = allwindows.FirstOrDefault(x => x.Name == "Test");
if (selectedWindows != null)
if (selectedWindows.IsActive)
selectedWindows.Close();
完整的表单代码(在本例中,当您单击按钮时表单将关闭)
public partial class MainWindow : Window
public MainWindow()
InitializeComponent();
WindowsManager.AllWindows.Add(this);
private void Button_Click(object sender, RoutedEventArgs e)
var allwindows = WindowsManager.AllWindows;
var selectedWindows = allwindows.FirstOrDefault(x => x.Name == "");
if (selectedWindows != null)
if (selectedWindows.IsActive)
selectedWindows.Close();
【讨论】:
这是一个管理窗口的类库(将 MvvmDialogs 移植到 Avalonia)。我不能要求用户将代码添加到他们的每一个视图中。但由于我设法打开所有窗口,我可以四处寻找和跟踪窗口的打开情况,收听关闭事件,以获得一个内部列表。我想先看看有没有更简单的选择。 这仍然是在 Avalonia 中访问 Windows 的最佳方式吗? @DonnyV。也许,但这是我的想法【参考方案2】:您需要IClassicDesktopStyleApplicationLifetime::Windows
属性。生命周期可从Application
的ApplicationLifetime
属性获得。
e。 g.
((IClassicDesktopStyleApplicationLifetime)Application.Current.ApplicationLifetime).Windows
请注意,它不适用于移动、WebAssembly 和 Linux 帧缓冲平台。
【讨论】:
还不知道 Mobile 和 WebAssembly 是否受支持?什么是 Linux 帧缓冲区?它是用于 MVVM 开发的通用库,因此它需要与任何用例兼容。那个接口名称专门说 ClassicDesktopApplication——在 Windows、Linux 和 MacOS 桌面上运行良好? WASM 目前处于预览阶段(运行现有应用程序大多开箱即用,但目前字体和完整 AOT 存在一些问题)。移动后端需要完成 IME 工作,预计在 2022 年第一季度完成,然后生产就绪的 ios 支持应该会很快变得可用。 Linux 帧缓冲区是 fbdev/kms-drm + libinput/libevdev 后端,旨在用于嵌入式设备。经典桌面生命周期专为桌面 Windows(不是 HoloLens 或 XBox)、桌面 Linux(X11 或 XWayland)和 macOS(包括 AppStore 的沙盒模式)设计。以上是关于Avalonia 获取所有窗口的主要内容,如果未能解决你的问题,请参考以下文章