使用Prism在PCL中导航

时间:2016-09-03 13:04:56

标签: c# navigation uwp prism printer-control-language

我正在使用棱镜构建一个带有PCL的UWP应用程序。

PCL包含ViewModels

UWP包含视图

我的问题是我不能在PCL中使用INavigationService,所以我无法真正导航到其他页面。

这是我的代码:

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,但它不是Prism.Core dll的一部分。

那么正确的方法是什么?甚至可以使用Prism在PCL中导航?在MvvmCross中它是......

2 个答案:

答案 0 :(得分:0)

我在项目中使用棱镜导航如下。

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

屏幕名称是导航视图模型中的属性。

希望这有帮助。

答案 1 :(得分:0)

导航不是在Prism中以跨平台方式构建的,因此如果没有自己的代码,它将无法工作。

要解决此问题,请在PCL中创建IAppNavigationService接口:

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进行导航。