Сохранение сетки в DependencyProperty в WinUI 3: работа с AppTitleBar в WinUI 3
Я столкнулся с любопытной проблемой, пытаясь работать с AppTitleBar в программе WinUI 3. Строка заголовка предназначена для динамического переформатирования (для слабовидящих пользователей), что означает, что мне нужно знать, где все находится в WindowChrome. Я использую системные кнопки в правом верхнем углу окна (находящиеся в MinMaxCloseContainer, сетке) в качестве ссылки для различных характеристик, поэтому, как только я нахожу ее в визуальном дереве, я сохраняю ее ссылку в DependencyProperty.
Проблема в том, что я получаю System.InvalidCastException: «Невозможно преобразовать объект типа «Microsoft.UI.Xaml.GridLength» в тип «System.Double». исключение в установщике свойств.
Я использую CommunityToolkit.Mvvm v7.1.2 и Microsoft.WindowsAppSDK 1.1.1 (WinUI 3). Проект нацелен на .NET 6.0. ViewModel является производным от ObservableRecipient.
Вот код, который ищет визуальное дерево:
var clientAreaPresenter = VisualTreeHelper.GetParent(shellPage) as ContentPresenter;
var layoutRoot = VisualTreeHelper.GetParent(clientAreaPresenter) as Grid; // this is the content of the WindowChrome (chrome and program content)
var titleBarMinMaxCloseContainer = VisualTreeHelper.GetChild(layoutRoot, 1) as Grid; // the system Min, Max and close buttons on the title bar
var minMaxCloseContainer = VisualTreeHelper.GetChild(titleBarMinMaxCloseContainer, 0) as Grid; // this container holds three Buttons: Min, Max, Close
ViewModel.MinMaxCloseContainer = minMaxCloseContainer; // remember where this is
(последняя строка устанавливает DependencyProperty) и вот определение свойства в модели представления:
/// <summary>
/// The system area containing the min, max and close buttons on the title bar
/// </summary>
public Grid MinMaxCloseContainer
{
get => _minMaxCloseContainer;
set => SetProperty(ref _minMaxCloseContainer, value);
}
Ошибка возникает в установщике, но стек вызовов показывает, что на самом деле она находится в методе SetProperty(). Хотя это выглядит как присваивание ссылки, я думаю, что метод SetProperty на самом деле получает частную копию. Ошибка, вероятно, связана с неопределенными значениями (double.NaN) в различных свойствах экземпляра minMaxCloseContainer (например, .Height и .Width во время инициализации). Код .NET, который я нашел для
Я пробовал: 1) прикрепить приведение к GridLength (недействительно в статических классах); 2) проверка неопределенных значений и их изменение перед назначением сетки (без эффекта); 3) настройка GridLengthConverter. Последний элемент является странным, поскольку в опубликованном коде .NET говорится, что преобразователь по умолчанию обрабатывает приведения из GridLength в Double даже со значениями double.NaN. Возможно, WinUI еще не реализовал GridLengthConverter.
В любом случае, все, что я пробовал, не сработало, и я не совсем понимаю, почему возникает ошибка. Благодарим за любую идею. Спасибо.