Создайте заставку XAML и перейдите на страницу с вкладками - PullRequest
0 голосов
/ 09 мая 2018

Я в значительной степени настроил свое XF-приложение, используя MVVMLight и следуя этой статье .

Теперь я хотел бы представить страницу-заставку XAML, загрузить ее при запуске, назначив ее свойству MainPage в App.xaml.cs. После загрузки на заставке я хотел бы выполнить несколько асинхронных задач для инициализации приложения, то есть извлечь исходные данные из API и т. Д. Как только это будет сделано, я бы хотел перейти на страницу MainTabbed.

Я еще не написал логику инициализации, поэтому использую Thread.Sleep для имитации этого.

Я прочитал много статей и попробовал пару вещей, и я застрял в точке, где у меня возникла одна из следующих проблем:

  1. Страница-заставка загружается, но затем не переходит на страницу с вкладками.
  2. Страница-заставка вообще не загружается и переходит на страницу с вкладками непосредственно.

Эта статья является самой близкой, с которой я сталкивался, но, похоже, при выпуске семафора я получаю ошибку:

05-09 19:22:12.471 I/MonoDroid(14342): System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Threading.SemaphoreFullException: Adding the specified count to the semaphore would cause it to exceed its maximum count.
05-09 19:22:12.471 I/MonoDroid(14342):   at System.Threading.SemaphoreSlim.Release (System.Int32 releaseCount) [0x0004c] in <fcbf47a04b2e4d90beafbae627e1fca4>:0 
05-09 19:22:12.471 I/MonoDroid(14342):   at System.Threading.SemaphoreSlim.Release () [0x00000] in <fcbf47a04b2e4d90beafbae627e1fca4>:0 

Примите во внимание любые советы по поводу вышеизложенного или о том, как можно реализовать заставку с использованием xaml (если это даже имеет концептуальный смысл), поскольку в большинстве статей используются собственные реализации или изображения в собственных проектах.

Заранее спасибо.

1 Ответ

0 голосов
/ 14 мая 2018

Хорошо !!Поэтому я разобрался с навигацией, и мне не нужно было беспокоиться о семафоре.

В следующих шагах подробно описан ответ:

  1. Создайте долгосрочный метод вкласс обслуживания или отдельный класс следующим образом

    public async Task LongRunning()
    {
        //Write code to download data from an API or something.
    }
    
  2. Создайте файл SplashPage.xaml и назначьте его свойству MainPage в App.cs.Это установит SplashPage в качестве 1-й или корневой страницы в NavigationStack.

  3. Если MVVMLight используется согласно ссылке , тогда:

    а.Создайте файл SplashViewModel.cs.

    b.В SplashViewModel.cs создайте частный асинхронный метод void с именем Initialize, который имеет следующий код:

    private async void Initialize()
    {
        //Need to await till the task is done. Very important
        await yourService.LongRunning();
    
        //Only after task is done should it navigate to next page
        NavigationService.NavigateTo(nameof(MainTabbedPage));
    }
    
  4. После перехода к MainTabbedPage MainTabbedPage станет второй страницей в навигациистек.Это не должно иметь место, поскольку 1-я или корневая страница всегда должны быть MainTabbedPage.Более того, не требуется снова переходить на SplashPage.Чтобы это исправить, поместите приведенный ниже код в событие OnAppearing объекта MainTabbedPage.

    protected override void OnAppearing()
    {
        base.OnAppearing();
        var splashPage = Navigation.NavigationStack[0];
        Navigation.RemovePage(splashPage);
    }
    

    Это позволит удалить SplashPage из стека навигации и установить MainTabbedPage в качестве корневой страницы перед переходом на другие страницы..

  5. Если вы не используете MVVMLight, а пишете код непосредственно в коде позади или что-то в этом роде, то код на шаге 3b можно поместить в код сзади - SplashPage.xaml.csи метод Initialize может быть вызван в конструкторе.

Я потратил довольно много времени на выяснение этого, поэтому я надеюсь, что это поможет при необходимости.

...