Как я могу инициализировать ShellView с другой страницы (Windows Template Studio) - PullRequest
1 голос
/ 10 октября 2019

Windows Template Studio: ссылочная ссылка

Я создал проект с Панель навигации Тип и Призма Шаблон, У меня есть Настройки инекоторые страницы

Вот файл App.xaml.cs:

[Windows.UI.Xaml.Data.Bindable]
public sealed partial class App : PrismUnityApplication
{
    public App()
    {
        InitializeComponent();
    }

    protected override void ConfigureContainer()
    {
        // register a singleton using Container.RegisterType<IInterface, Type>(new ContainerControlledLifetimeManager());
        base.ConfigureContainer();
        Container.RegisterInstance<IResourceLoader>(new ResourceLoaderAdapter(new ResourceLoader()));
        Container.RegisterType<ISampleDataService, SampleDataService>();
    }

    protected override async Task OnLaunchApplicationAsync(LaunchActivatedEventArgs args)
    {
        await LaunchApplicationAsync(PageTokens.MainPage, null);
    }

    private async Task LaunchApplicationAsync(string page, object launchParam)
    {
        await ThemeSelectorService.SetRequestedThemeAsync();
        NavigationService.Navigate(page, launchParam);
        Window.Current.Activate();
    }

    protected override async Task OnActivateApplicationAsync(IActivatedEventArgs args)
    {
        await Task.CompletedTask;
    }

    protected override async Task OnInitializeAsync(IActivatedEventArgs args)
    {
        await base.OnInitializeAsync(args);
        await ThemeSelectorService.InitializeAsync().ConfigureAwait(false);

        //We are remapping the default ViewNamePage and ViewNamePageViewModel naming to ViewNamePage and ViewNameViewModel to
        //gain better code reuse with other frameworks and pages within Windows Template Studio
        ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver((viewType) =>
        {
            var viewModelTypeName = string.Format(CultureInfo.InvariantCulture, "App1.ViewModels.{0}ViewModel, App1", viewType.Name.Substring(0, viewType.Name.Length - 4));
            return Type.GetType(viewModelTypeName);
        });
    }

    protected override IDeviceGestureService OnCreateDeviceGestureService()
    {
        var service = base.OnCreateDeviceGestureService();
        service.UseTitleBarBackButton = false;
        return service;
    }

    public void SetNavigationFrame(Frame frame)
    {
        var sessionStateService = Container.Resolve<ISessionStateService>();
        CreateNavigationService(new FrameFacadeAdapter(frame), sessionStateService);
    }

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

Я хочу показать SignInPage перед отображением ShellPage , такЯ создал SignInPage в папке Views и создал SignInPageViewModel класс в папке ViewModels .

Я пытался изменить OnLaunchApplicationAsync to:

protected override async Task OnLaunchApplicationAsync(LaunchActivatedEventArgs args)
    {
        await LaunchApplicationAsync("SignIn", null);
    }

и удалил:

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

Теперь страница запуска моего приложения - моя SignInPage , У меня есть LogInButton на этой странице, и я связал команду с моей делегатской командой viewmodel, но он не смог найти мою viewmodel (ViewModelLocator.AutoWireViewModel = "True"), поэтому я добавил это в свое приложение.xaml.cs:

protected override void ConfigureViewModelLocator()
    {
        base.ConfigureViewModelLocator();

        ViewModelLocationProvider.Register<SignInPage, ViewModels.SignInPageViewModel>();
    }

ВОПРОС 1: Почему он не может найти мою модель представления дажеимеет то же пространство имен с автоматически созданными страницами?

Теперь команда кнопки должна перейти к ShellPage , поэтому всякий раз, когда я нажимаю кнопку, она переходит к ShellPage но кадр не инициализируется должным образом, поэтому при попытке перейти на любую страницу я получаю нулевую ссылку.

Вопрос 2: Как инициализировать ShellPage при навигации?

1 Ответ

1 голос
/ 10 октября 2019

Возможно, проблема в вашем имени.

Измените SignInPageViewModel на SignInViewModel.

protected override async Task OnInitializeAsync(IActivatedEventArgs args)
{
    await base.OnInitializeAsync(args);

    //We are remapping the default ViewNamePage and ViewNamePageViewModel naming to ViewNamePage and ViewNameViewModel to
    //gain better code reuse with other frameworks and pages within Windows Template Studio
    ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver((viewType) =>
    {
        var viewModelTypeName = string.Format(CultureInfo.InvariantCulture, "App1.ViewModels.{0}ViewModel, App1", viewType.Name.Substring(0, viewType.Name.Length - 4));
        return Type.GetType(viewModelTypeName);
    });
}

Обратите внимание на эту функцию, которая используется для регистрации ViewModel текущегостр. Согласно соответствующему соглашению об именах, если имя Page равно {name}Page.xaml, то ViewModel имеет значение {name}ViewModel.cs.


Обновление

Какможно ли инициализировать ShellPage при навигации?

Если честно, такое поведение не соответствует текущей архитектуре. Поскольку по умолчанию приложение имеет только один rootFrame, но поскольку вы удаляете переопределение метода CreateShell, оно обязано ввести второй кадр, который вызовет неизвестную ошибку.

Если вы настаиваете, я предоставляюметод здесь, но он не будет правильно сохранять session state при закрытии программного обеспечения.

App.xaml.cs

public static App Instance;
public App()
{
    InitializeComponent();
    Instance = this;
}

SignInPage.xaml.cs

Прослушайте событие SignInButton_Click в xaml

private void SignInButton_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
    var rootFrame = Window.Current.Content as Frame;
    var frame = new Frame();
    App.Instance.SetNavigationFrame(frame);
    rootFrame.Navigate(typeof(ShellPage), frame);
}

ShellPage.xaml.cs

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    if(e.Parameter is Frame frame)
    {
        SetRootFrame(frame);
        frame.Navigate(typeof(MainPage));
    }
}

С наилучшими пожеланиями.

...