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 属性。生命周期可从ApplicationApplicationLifetime 属性获得。

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 获取所有窗口的主要内容,如果未能解决你的问题,请参考以下文章

Avalonia跨平台入门第十五篇之ListBox聊天窗口

一起学习Avalonia(十二)

一起学习Avalonia(十二)

Avalonia跨平台入门第二十三篇之滚动字幕

Avalonia跨平台入门第二十二篇之人脸检测

Avalonia跨平台入门第二十篇之语音播放问题