Как переключать представления в приложении UWP - PullRequest
0 голосов
/ 31 января 2019

Я заинтересован в создании приложения UWP (работающего на HoloLens, хотя это не должно иметь значения с точки зрения кода), которое запускается в 2D-виде по умолчанию XAML и затем может переключиться в 3D-представление по команде.Трехмерный вид создается с помощью UrhoSharp.

При изучении того, как сделать это в Интернете, я наткнулся на следующий код, который выглядел как просто билет для меня (хотя он запускается в 3D, затем переключается в 2D, противоположная последовательностьто, что я хочу):

https://mtaulty.com/2016/10/25/windows-10-uwp-hololens-and-switching-2d3d-views/

Я нахожу код довольно сложным для понимания со всеми асинхронными / ожидающими лямбдами, но последняя функция "SwitchViewsAsync" поставила меня в тупик,Для удобства я воспроизведу приведенный ниже код:

    namespace ViewLibrary
    {
        using System;
        using System.Threading.Tasks;
        using Windows.ApplicationModel.Core;
        using Windows.UI;
        using Windows.UI.Core;
        using Windows.UI.ViewManagement;
        using Windows.UI.Xaml;
        using Windows.UI.Xaml.Controls;
        using Windows.UI.Xaml.Media;

        public static class ViewManagement
        {
            static CoreApplicationView coreView3d;
            static CoreApplicationView coreView2d;

            public static async Task SwitchTo2DViewAsync()
            {
                if (coreView3d == null)
                {
                    coreView3d = CoreApplication.MainView;
                }
                if (coreView2d == null)
                {
                    coreView2d = CoreApplication.CreateNewView();

                    await RunOnDispatcherAsync(
                        coreView2d, 
                        async () =>
                        {
                            Window.Current.Content = Create2dUI();
                        });
                }
                await RunOnDispatcherAsync(coreView2d, SwitchViewsAsync);
            }

            static UIElement Create2dUI()
            {
                var button = new Button()
                {
                    HorizontalAlignment = HorizontalAlignment.Stretch,
                    VerticalAlignment   = VerticalAlignment.Stretch,
                    Content             = "Back to 3D",
                    Background          = new SolidColorBrush(Colors.Red)
                };

                button.Click += async (s, e) =>
                {
                    await SwitchTo3DViewAsync();
                };

            return (button);
        }

        static async Task RunOnDispatcherAsync(CoreApplicationView view,Func<Task> action)
        {
            await view.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => action());
        }

        public static async Task SwitchTo3DViewAsync()
        {
            await RunOnDispatcherAsync(coreView3d, SwitchViewsAsync);
        }

        static async Task SwitchViewsAsync()
        {
            var view = ApplicationView.GetForCurrentView();
            await ApplicationViewSwitcher.SwitchAsync(view.Id);
            Window.Current.Activate();
        }
    }
}

Что меня больше всего смущает, так это метод SwitchViewAsync () внизу.Он вызывает «ApplicationView.GetForCurrentView ()», а затем переключается на него через «ApplicationViewSwitcher.SwitchAsync (...)».Это, кажется, получает текущее представление ... и затем переключается на это?Если вид актуален, зачем переходить на него?Может кто-нибудь помочь мне понять, что здесь происходит?

...