Навигация в PCL с помощью Prism

Я создаю приложение UWP с PCL, используя prism.

PCL содержит ViewModels

UWP содержит представления

Моя проблема в том, что я не могу использовать INavigationService в PCL, поэтому я не могу переходить на другие страницы.

Вот мой код:

MainPage.xaml (в проекте UWP):

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

        <SplitView x:Name="RootSplitView"
                   DisplayMode="Overlay"
                   IsTabStop="False">
            <SplitView.Pane>
                <StackPanel Margin="0,50,0,0">
                    <Button Content="Second" Command="{x:Bind ViewModel.SecondPageCommand}"  />
                    <Button Content="Third" />
                </StackPanel>
            </SplitView.Pane>

            <!-- OnNavigatingToPage we synchronize the selected item in the nav menu with the current page.
                 OnNavigatedToPage we move keyboard focus to the first item on the page after it's loaded and update the Back button. -->
            <Frame x:Name="FrameContent" />
        </SplitView>

        <ToggleButton x:Name="TogglePaneButton"
                      TabIndex="1"                      
                      IsChecked="{Binding IsPaneOpen, ElementName=RootSplitView, Mode=TwoWay}"
                      ToolTipService.ToolTip="Menu"
                      Style="{StaticResource SplitViewTogglePaneButtonStyle}"
                      />
    </Grid>

ViewModel (в PCL):

 public class NavigationRootViewModel : BindableBase
    {
        public ICommand SecondPageCommand { get; set; }
        public NavigationRootViewModel()
        {
            SecondPageCommand = DelegateCommand.FromAsyncHandler(ExecuteMethod);
        }

        private Task ExecuteMethod()
        {
            return Task.FromResult(0);
        }
    }

Я хотел внедрить INavigationService в конструктор, но он не является частью dll Prism.Core.

Так как же правильно это сделать? Можно ли вообще перемещаться в PCL с помощью Prism? в MvvmCross это...


person kaycee    schedule 03.09.2016    source источник


Ответы (2)


Навигация в Prism не построена кроссплатформенно, поэтому без собственного кода она не будет работать.

Чтобы решить эту проблему, создайте интерфейс IAppNavigationService в PCL:

public interface IAppNavigationService
{
    bool Navigate(string pageToken, object parameter);
    void GoBack();
    bool CanGoBack();
}

Реализуйте его в проекте Windows, в основном просто как оболочку вокруг INavigationService, которую вы также можете внедрить:

public class AppNavigationService : IAppNavigationService
{
   private readonly INavigationService _nav;

   public AppNavigationService( INavigationService navigationService )
   {
      _nav = navigationService;
   } 

   public bool Navigate(string pageToken, object parameter) => 
      _nav.Navigate( pageToken, parameter );

   public void GoBack()
   {
      _nav.GoBack();
   }

   public bool CanGoBack() => _nav.CanGoBack();
}

Не забудьте зарегистрировать класс AppNavigationService в контейнере внедрения зависимостей в App.xaml.cs.

Теперь в ваших PCL ViewModels вы можете просто ввести и использовать IAppNavigationService для навигации.

person Martin Zikmund    schedule 03.09.2016
comment
да, это хороший ответ. шаблон декоратора сделает свою работу. просто странно, почему призма не поддерживает навигацию в PCL из коробки. Спасибо - person kaycee; 04.09.2016
comment
Вероятно, это связано с тем, что существуют различия между парадигмами навигации, используемыми на разных платформах, поэтому это позволяет вам учитывать именно то, что вам нужно. С другой стороны, у MvvmCross есть отличное решение, которое также можно расширять. - person Martin Zikmund; 04.09.2016

Я использовал призменную навигацию в нашем проекте следующим образом.

var regionManager = container.Resolve<IRegionManager>();
if (screenName == SpEnums.ViewName.LuminationView.ToString())
{
     regionManager.RequestNavigate(Enums.Regions.MainRegion.ToString(),
     SpEnums.ViewName.LuminationView.ToString());
}
else if()...

имя экрана является свойством в модели представления навигации.

Надеюсь это поможет.

person FreeMan    schedule 03.09.2016
comment
Я знаю регионального менеджера из приложений WPF. это не часть сердечника призмы, поэтому его нельзя использовать в PCL - person kaycee; 03.09.2016