2016-10-11 3 views
0

Когда я называюPrism + XF: Как перейти на другую точку зрения в зависимости от приложения состояния

navigationService.NavigateAsync('MyPage')

в зависимости от разрешения экрана, он должен показать вид по-разному:

On большой экран он показывает панель внутри текущей PageContentView должен быть создан внутри текущего ContentPage), и на маленьких экранах он должен перейти к Page

Как я могу достичь этого с помощью Призмы?

EDIT: Проблема у меня есть на самом деле, как показать представление. На маленьком экране он перемещается на Page, как на большом экране ему нужно сделать View, видимым на текущей странице.

Как я могу это достичь? Должен ли я создать свою навигационную службу и переопределить NavigateAsync? И на основе имени вида и устройства идиомы, я либо перейти к нему с поведением по умолчанию, или я показываю вид в текущем виде:

public class MyPageNavigationService : UnityPageNavigationService 
{ 
    public MyPageNavigationService (IUnityContainer container, IApplicationProvider applicationProvider, ILoggerFacade logger) 
     : base(container, applicationProvider, logger) 
    { 
    } 

    public override Task NavigateAsync(string name, NavigationParameters parameters = null, bool? useModalNavigation = default(bool?), bool animated = true) 
    { 
     if(Device.Idiom == TargetIdiom.Tablet) 
     { 
      if (name == "TheNextPage") 
      { 
       // do custom stuff here, show the view inside current Page 
      } 
      else 
      { 
       return base.NavigateAsync(name, parameters, useModalNavigation, animated); 
      } 
     } 
     else 
     { 
      return base.NavigateAsync(name, parameters, useModalNavigation, animated); 
     } 
    } 
} 

ответ

1

Как бы вы сделать это без Prism? Вы приближаетесь, не меняются, хотя вы можете использовать различные функции Prism, чтобы упростить управление. Вы можете создать модуль (проект) для каждого размера устройства, которое вы хотите поддерживать. Затем загрузите только нужный модуль на основе устройства. Это позволит вам регистрировать все представления с одним и тем же ключом и всегда переходить к одному и тому же ключу, но в зависимости от того, какой модуль загружен, вы получите другую страницу. Это позволит очистить ViewModels.

Или вы могли бы просто использовать good'ol

if (some screensize) 
_navigationService.NavigateAsync("SmallPage"); 
else 
_navigationService.NavigateAsync("BiggerPage"); 

лично я хотел бы использовать подход модуля.

+0

спасибо. Я всегда могу найти «решения», но лишь немногие верны. Разделение по модулю имеет смысл, но оно добавляет немного сложности. – JamesL

+0

Я бы сказал, что это делает его простым, и ваш код будет намного чище. Таким образом, вам не нужно иметь логические проверки в вашем коде, чтобы использовать другую страницу. Это загрязнит вашу базу кода. Используя модули, вы загружаете только те виды, которые вам нужны для устройства, и ничего больше не меняется. Ваша логика VM всегда будет перемещаться к той же клавише View. Просто. –

+0

Одной из проблем, которые возникают у меня иногда, является то, что модели-образцы можно легко использовать в сценарии, где у вас есть представление для небольшого экрана и другого представления для большего экрана. В представлении для небольших экранов есть кнопка, которая переходит на следующий экран, но она не существует в представлении для больших экранов, потому что на большом экране следующий вид сидит на одной странице (это даже не страница, это вид). Это позволяет модели представления для маленького экрана иметь команду, которая не существует на большом экране. В то же время необходимо разделить другую функциональность между малыми и большими экранами просмотра. – JamesL