#c# #.net #.net-core #avaloniaui #avalonia
#c# #.net #.net-ядро #авалониауи #авалония
Вопрос:
Есть ли способ получить список всех окон в Авалонии?
Эквивалент этого в WPF
Application.Current.Windows
Мое требование состоит в том, чтобы активировать или закрыть определенное окно на основе его DataContext.
Если я не могу получить доступ к такому списку; есть ли способ отслеживать создание и уничтожение окон для создания внутреннего списка?
Ответ №1:
Вам нужна IClassicDesktopStyleApplicationLifetime::Windows
собственность. Срок службы доступен из Application
ApplicationLifetime
собственности.
например.
((IClassicDesktopStyleApplicationLifetime)Application.Current.ApplicationLifetime).Windows
Обратите внимание, что он недоступен для мобильных платформ, платформ веб-сборки и фреймбуферов Linux.
Комментарии:
1. Вы еще не знали, что мобильные и веб-сборки поддерживаются вообще? Что такое фреймбуфер Linux? Это универсальная библиотека для разработки MVVM, поэтому она должна быть совместима с любым вариантом использования. В этом названии интерфейса конкретно указано приложение ClassicDesktopApplication-отлично работает на настольных компьютерах Windows, Linux и macOS?
2. WASM в настоящее время находится в режиме предварительного просмотра (запускает существующие приложения в основном из коробки, но сейчас есть некоторые проблемы со шрифтами и полным AOT). Мобильные бэкэнды нуждаются в завершении работы над IME, которая ожидается в 1 квартале 2022 года, после чего поддержка iOS, готовая к производству, должна стать доступной довольно быстро. Фреймбуфер Linux-это серверная часть fbdev/kms-drm libinput/libevdev, предназначенная для использования на встроенных устройствах. Classic desktop lifetime предназначен для dekstop Windows (не HoloLens или XBox), настольных Linux (X11 или XWayland) и macOS (включая изолированный режим для AppStore).
Ответ №2:
вы можете создать WindowsManagerClass
с помощью одного static
свойства с типом Listlt;Windowgt;
, подобным этому
public class WindowsManager { public static Listlt;Windowgt; AllWindows = new Listlt;Windowgt;(); }
и добавьте во все окна, как этот код, в свой конструктор форм
public MainWindow() { InitializeComponent(); WindowsManager.AllWindows.Add(this); }
и там, где вам нужно, вы можете получить доступ к ссылке, подобной этой
var allwindows = WindowsManager.AllWindows; var selectedWindows = allwindows.FirstOrDefault(x =gt; 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 =gt; x.Name == ""); if (selectedWindows != null) { if (selectedWindows.IsActive) { selectedWindows.Close(); } } } }
Комментарии:
1. Это библиотека классов, управляющая Windows (перенос MvvmDialogs в Avalonia). Я не могу просить пользователей добавлять код в каждое из своих представлений. Но так как мне удается открывать все окна, я мог бы взломать и отслеживать открытие окон, прослушивать события закрытия, чтобы иметь внутренний список. Сначала я хочу посмотреть, есть ли более простой вариант.