Поддержка MvvmCross 4 для UWP, отсутствие кадра в AppShell

Я создал новое решение для своего приложения MvvmCross, которое поддерживает Магазин Windows, и я хочу поддерживать UWP в Windows 10. Я успешно перешел на PCL, но у меня возникли проблемы с работой базового приложения UWP с использованием образца, предоставленного MS ( NavigationMenu), который использует SplitView и шаблон AppShell, которые они рекомендуют для новой модели навигации/команд. Я сослался на полезную запись в блоге (http://stephanvs.com/implementing-a-multi-region-presenter-for-windows-10-uwp-and-mvvmcross/), что дало мне некоторые рекомендации по интеграции mvvmcross в AppShell, но запуск завершается со сбоем, поскольку в AppShell не определен допустимый фрейм. Свойство Frame доступно только для чтения, и я не смог увидеть, где оно настраивается.

Я использую стандартную реализацию AppShell из NavigationMenu со следующими изменениями, рекомендованными в сообщении блога:

public sealed partial class AppShell : MvxWindowsPage // was Page

public Frame AppFrame { get { return this.Frame; } } // was this.frame

Кроме кода после ошибки отличий в настройке нет. Глядя на реализацию MvxWindowsPage, кажется, что в ней нет ничего особенного, поскольку она по-прежнему вызывает инициализацию страницы. Есть ли что-то очевидное, что я упускаю?


person johnslaby    schedule 18.11.2015    source источник
comment
Попробуйте следующее: Frame currentFrame = (Frame) this.WrappedFrame.UnderlyingControl;   -  person Depechie    schedule 20.11.2015


Ответы (2)


Таким образом, ссылка на сообщение в блоге верна, другими словами, вам нужно использовать MultiRegions из MvvmCross, чтобы это заработало. Но то, что не отображается в блоге, - это полная рабочая версия...

Я добавил один на свой github здесь: https://github.com/Depechie/MvvmCrossUWPSplitView

Некоторые указатели, чтобы убрать, как я сказал в комментариях. Ваше представление, в котором будет присутствовать SplitView, должно иметь свойство возвращать допустимый фрейм для поиска при вставке новых представлений. Это можно вернуть следующим образом return (Frame)this.WrappedFrame.UnderlyingControl; в коде здесь https://github.com/Depechie/MvvmCrossUWPSplitView/blob/master/MvvmCrossUWP.Win/Views/FirstView.xaml.cs#L13

Чем все представления, которые вы хотите загрузить в SplitView, должны будут ссылаться на регион, который вы определили в этом SplitView, в моем случае я назвал его FrameContent, как показано здесь https://github.com/Depechie/MvvmCrossUWPSplitView/blob/master/MvvmCrossUWP.Win/Views/FirstView.xaml#L48

Поэтому используйте это имя для атрибута региона во всех загружаемых представлениях, например [MvxRegion("FrameContent")] пример здесь https://github.com/Depechie/MvvmCrossUWPSplitView/blob/master/MvvmCrossUWP.Win/Views/SecondView.xaml.cs#L7

person Depechie    schedule 21.11.2015
comment
Это замечательно. У меня есть последняя проблема, которую я не могу решить. Я хотел бы заполнить кадр представлением по умолчанию при запуске. В примере рамка остается пустой, пока вы не выберете параметр. Я пытался перейти на страницу с помощью ShowViewModel из нескольких мест (конструктор виртуальной машины splitview, метод Init, в настройках после вызова метода запуска и т. д.), но в каждом случае, когда я пытался, представление не загружалось с помощью ошибка «Регион xxx не найден в DefaultView», поиск кадра в представлении по умолчанию, а не в разделенном представлении. Любые идеи? - person johnslaby; 25.12.2015
comment
Ну, эта ошибка связана с тем, что в MvvmCross модели мира будут инициализированы до представлений. Таким образом, фрейм еще недоступен для загрузки содержимого. Быстрое исправление, зарегистрируйте событие Loaded кадра в первом представлении и затем перейдите к любой из моделей представления. Я обновил свой пример на github с помощью этого принципала! - person Depechie; 25.12.2015
comment
Идеальный! Я использовал прикрепленное поведение, обрабатывающее событие Loaded, как вы предложили. В вашем примере есть ссылка на «core:EventTriggerBehavior», которую я не смог найти, но руководство было точным. Большое спасибо. - person johnslaby; 26.12.2015
comment
Ha это пакет nuget, это новое поведение Microsoft UWP, которое теперь доступно... - person Depechie; 26.12.2015

Я вижу, что вы пытаетесь сделать с помощью шаблона SplitView, предоставленного Microsoft. Однако существует несоответствие между вещами, управляемыми MvvmCross и UWP.

По умолчанию MvvmCross сопоставляет ViewModels с представлениями на основе соглашений об именах. То, что вы пытаетесь сделать, это использовать представление «AppShell» (производное от Windows.UI.Xaml.Controls.Page), которое не соответствует соглашению MvvmCross по умолчанию.

Я решил реализовать эту функцию SplitView (Hamburger) путем полного удаления предоставленного класса AppShell. Затем я создал новое представление с именем HomeView (поскольку у меня есть ViewModel с именем HomeViewModel) и добавил туда элемент управления SplitView, как описано в сообщении, которое вы упомянули выше.

Для полноты картины я создал Gist с App.xaml.cs и HomeView.xaml, как вы просили. Вы можете найти их здесь: https://gist.github.com/Stephanvs/7bb2cdc9dbf15cb7a90f

person Stephanvs    schedule 21.11.2015