Windows Template Studio Prism Навигация - PullRequest
0 голосов
/ 21 февраля 2019

Я использую Windows Template Studio (Prism) для создания тестового проекта, но из документации я не могу понять навигацию.Теперь я знаю, как это сделать с MVVM Light, но мне пришлось спросить, потому что в документации это не описано.Как перейти от страницы к странице в Prism Windows Template Studio?

Работает для MVVM Light:

ViewModelLocator.Current.NavigationService.Navigate(typeof(MyViewModel).FullName, null)

Работает на Template10:

BootStrapper.Current.NavigationService.Navigate(typeof(MyViewPage), null)

1 Ответ

0 голосов
/ 22 февраля 2019

Вы можете создать тестовое приложение с Windows Template Studio и проверить тип проекта страницы навигации, а затем проверить шаблон проектирования призмы.Вы найдете _navigationService в классе ShellViewModel.

Работает в Windows Template Studio Prism

_navigationService.Navigate(pageKey, null);

ShellViewModel.cs

public class ShellViewModel : ViewModelBase
{
    private static INavigationService _navigationService;
    private WinUI.NavigationView _navigationView;
    private bool _isBackEnabled;
    private WinUI.NavigationViewItem _selected;

    public ICommand ItemInvokedCommand { get; }

    public bool IsBackEnabled
    {
        get { return _isBackEnabled; }
        set { SetProperty(ref _isBackEnabled, value); }
    }

    public WinUI.NavigationViewItem Selected
    {
        get { return _selected; }
        set { SetProperty(ref _selected, value); }
    }

    public ShellViewModel(INavigationService navigationServiceInstance)
    {
        _navigationService = navigationServiceInstance;
        ItemInvokedCommand = new DelegateCommand<WinUI.NavigationViewItemInvokedEventArgs>(OnItemInvoked);
    }

    public void Initialize(Frame frame, WinUI.NavigationView navigationView)
    {
        _navigationView = navigationView;
        frame.NavigationFailed += (sender, e) =>
        {
            throw e.Exception;
        };
        frame.Navigated += Frame_Navigated;
        _navigationView.BackRequested += OnBackRequested;
    }

    private void OnItemInvoked(WinUI.NavigationViewItemInvokedEventArgs args)
    {
        var item = _navigationView.MenuItems
                        .OfType<WinUI.NavigationViewItem>()
                        .First(menuItem => (string)menuItem.Content == (string)args.InvokedItem);
        var pageKey = item.GetValue(NavHelper.NavigateToProperty) as string;
        _navigationService.Navigate(pageKey, null);


    }

    private void Frame_Navigated(object sender, NavigationEventArgs e)
    {
        IsBackEnabled = _navigationService.CanGoBack();
        Selected = _navigationView.MenuItems
                        .OfType<WinUI.NavigationViewItem>()
                        .FirstOrDefault(menuItem => IsMenuItemForPageType(menuItem, e.SourcePageType));
    }

    private void OnBackRequested(WinUI.NavigationView sender, WinUI.NavigationViewBackRequestedEventArgs args)
    {
        _navigationService.GoBack();
    }

    private bool IsMenuItemForPageType(WinUI.NavigationViewItem menuItem, Type sourcePageType)
    {
        var sourcePageKey = sourcePageType.Name;
        sourcePageKey = sourcePageKey.Substring(0, sourcePageKey.Length - 4);
        var pageKey = menuItem.GetValue(NavHelper.NavigateToProperty) as string;
        return pageKey == sourcePageKey;
    }
}

_navigationService исходит из метода конструкции ShellViewModel.И этот экземпляр был создан в классе App.

protected override UIElement CreateShell(Frame rootFrame)
{
    var shell = Container.Resolve<ShellPage>();
    shell.SetRootFrame(rootFrame);
    return shell;
}
...