【问题标题】:Avalonia Get All WindowsAvalonia 获取所有窗口
【发布时间】:2022-01-11 23:48:46
【问题描述】:

有没有办法获取 Avalonia 中所有窗口的列表?

WPF 中的 this 等价物

Application.Current.Windows

我的要求是根据其DataContext激活或关闭某个窗口。

如果我无法访问这样的列表;有没有办法跟踪窗口的创建和销毁以创建内部列表?

【问题讨论】:

    标签: c# .net .net-core avaloniaui avalonia


    【解决方案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 的沙盒模式)设计。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 2011-11-08
    相关资源
    最近更新 更多