Я разрабатываю настольное приложение WinUI 3 с помощью Template Studio и сталкиваюсь с трудностями при отслеживании изменений отображения, таких как ориентация и DPI. Приложение использует пользовательские окна, производные от WindowEx, и мне нужно подключить обработчики событий для изменений отображения.
Вот упрощенный код, иллюстрирующий мой подход:
using Microsoft.UI.Dispatching;
using Windows.Graphics.Display;
using Windows.UI.ViewManagement;
namespace EasyDisplay;
public sealed partial class MainWindow : WindowEx
{
public MainWindow()
{
InitializeComponent();
Content = null;
Title = "AppDisplayName".GetLocalized();
this.Activated += WindowEx_Activated;
}
private void DisplayInformation_OrientationChanged(DisplayInformation sender, object args)
{
// Intended handling of orientation changes
}
private void WindowEx_Activated(object sender, Microsoft.UI.Xaml.WindowActivatedEventArgs args)
{
this.Activated -= WindowEx_Activated; // To avoid multiple subscriptions
App.MainWindow.DispatcherQueue.TryEnqueue(() =>
{
var displayInformation = DisplayInformation.GetForCurrentView();
displayInformation.OrientationChanged += DisplayInformation_OrientationChanged;
});
}
}
Всякий раз, когда я пытаюсь получить доступ к DisplayInformation.GetForCurrentView(), я сталкиваюсь со следующей ошибкой COMException, независимо от того, расположен ли код в MainWindow или на странице:
Exception thrown: 'System.Runtime.InteropServices.COMException' in WinRT.Runtime.dll
WinRT information: Windows.Graphics.Display: GetForCurrentView must be called on a thread that is associated with a CoreWindow.
Element not found.
Я пробовал различные подходы, чтобы убедиться, что я нахожусь в потоке пользовательского интерфейса, и отложить подписку на события до полной активации окна, но ошибка не устранена.
Как правильно обнаружить изменения отображения, такие как ориентация и DPI, в WinUI 3 с помощью WindowEx? Есть ли какой-то конкретный момент в жизненном цикле приложения или конкретный метод успешного подключения этих обработчиков событий?





DisplayInformation.GetForCurrentView() больше не поддерживается в WinUI 3.
В настоящее время в WinUI3 нет события OrientationChanged, вам следует дождаться версии 1.5. Если вы используете wasdk v1.5-exp2, вы можете получить доступ к этому новому API.
Возможно, вы можете использовать событие SizeChanged до тех пор, пока API exp2 не станет стабильной версии 1.5.
Как вы можете видеть по ссылке omd, OrientationChanged добавлено в Microsoft.Graphics.Display.DisplayInformation.
https://omds.xaml.dev/WinAppSDKv1.4_v1.5e2.html
Обратите внимание, что вы используете неправильный класс
DisplayInformation: тот, что вWindows.Graphics.Display, предназначен для UWP, а класс для WinUI3 — вMicrosoft.Graphics.Display. Вы можете получить ссылку с помощьюDisplayInformation.CreateForWindowId(this.AppWindow.Id);, но событиеOrientationChangedвсе равно еще не существует.