Сохранение сетки в 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.

В любом случае, все, что я пробовал, не сработало, и я не совсем понимаю, почему возникает ошибка. Благодарим за любую идею. Спасибо.

0 ответов

Другие вопросы по тегам