Я заинтересован в создании приложения 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 (...)».Это, кажется, получает текущее представление ... и затем переключается на это?Если вид актуален, зачем переходить на него?Может кто-нибудь помочь мне понять, что здесь происходит?