Авалония Получит Все Окна

#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). Я не могу просить пользователей добавлять код в каждое из своих представлений. Но так как мне удается открывать все окна, я мог бы взломать и отслеживать открытие окон, прослушивать события закрытия, чтобы иметь внутренний список. Сначала я хочу посмотреть, есть ли более простой вариант.