Окно настраиваемого диалогового окна отключается, когда в методе требуется возвращаемое значение - PullRequest
0 голосов
/ 08 мая 2020

Страница будет отображаться только при использовании Task.Delay ()!

Примечание: обновлено, чтобы предоставить больше информации о моем коде / вызовах, также я обнаружил, что если метод настраиваемого диалогового окна получает вызывается везде, где есть метод возврата, тогда диалоговое окно отключено (по крайней мере, в диалоговом окне ничего не работает), если я помещаю тот же вызов в метод void, мне не нужен await Task.Delay, и все реагирует, например поскольку индикатор активности вращается и так далее ...

здесь инициализируется страница ...

    public void InitLoadingPage(ContentPage loadingPage = null)
    {
        // check if the page parameter is available
        if (loadingPage != null)
        {
            // build the loading page with native base
            loadingPage.Parent = Xamarin.Forms.Application.Current.MainPage;
            loadingPage.Layout(new Rectangle(0, 0,
            Xamarin.Forms.Application.Current.MainPage.Width,
            Xamarin.Forms.Application.Current.MainPage.Height));
            var renderer = loadingPage.GetOrCreateRenderer();
            _nativeView = renderer.View;
            _dialog = new Dialog(CrossCurrentActivity.Current.Activity);

            _dialog.RequestWindowFeature((int)WindowFeatures.NoTitle);

            _dialog.SetCancelable(true);

            _dialog.SetContentView(_nativeView);

            Window window = _dialog.Window;

            window.SetLayout(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.MatchParent);

            window.ClearFlags(WindowManagerFlags.DimBehind);

            window.SetBackgroundDrawable(new ColorDrawable(Android.Graphics.Color.Transparent));
            _isInitialized = true;
        }
    }

Вот способ показать страницу ..

    public void ShowLoadingPage()
    {
        // check if the user has set the page or not
        if (!_isInitialized)
            InitLoadingPage(new LoadingPageDefault()); // set the default page

        // showing the native loading page
        _dialog.Show();
    }

И он называется так ...

   DependencyService.Get<ILodingPageService>().InitLoadingPage(new NetWorkScanPage());
   DependencyService.Get<ILodingPageService>().ShowLoadingPage();
   while (BaseObject.IsBusy)
   {
      await Task.Delay(1000).ConfigureAwait(true);
   }
   BaseObject.IsBusy = true;

Мой вопрос ... Есть ли способ показать окно без использования await Task.Delay (1000)?

1 Ответ

0 голосов
/ 11 мая 2020

Мне удалось решить эту проблему, поместив метод, который я вызывал, в ожидаемую задачу, я знаю, что это связано с тем, что я все еще учусь правильно кодировать, но я все равно опубликую свое решение, если кто-то как и у меня такая же проблема: -)

    public async Task<bool> SomeMethod()
    {
        DependencyService.Get<ILodingPageService>().InitLoadingPage(new YourLoadingPage());
        DependencyService.Get<ILodingPageService>().ShowLoadingPage();
        var SomeValue = false;
        if (await WhileIsBusy())
        {
            // Do stuff...
            SomeValue = true; // Some other Method that returns a value
        }
        return SomeValue;
    }
    public static async Task<bool> WhileIsBusy(int frequency = 25, int timeout = -1)
    {
        bool IsBusy = true; // This can be a property in your BaseViewModel
        bool Completed = false;
        var waitTask = Task.Run(async () =>
        {
            while (IsBusy)
            {
                await Task.Delay(frequency);
                Completed = SomeMethodToReturn();
                IsBusy = false;
            }
        });
        if (waitTask != await Task.WhenAny(waitTask, Task.Delay(timeout)))
        {
            throw new TimeoutException();
        }
        return Completed;
    }

Это будет держать LoadingPage активным в ожидании возвращаемого значения, когда все будет завершено, вы можете позвонить ...

DependencyService.Get<ILodingPageService>().HideLoadingPage();

Надеюсь, это поможет кому-то вроде меня, который все еще пытается учиться.

...