Как создать CoreApplicationView (C ++ / CX)? - PullRequest
0 голосов
/ 15 февраля 2020

I Я пытаюсь создать второе окно в UWP, но у меня ничего не получается. К сожалению, я не очень хорошо разбираюсь в UWP, и есть несколько руководств по C ++ / CX. Мой IFrameworkViewSource:

IFrameworkView^ ApplicationSource::CreateView()
{
    return ref new test();
}

максимально простая реализация IFrameworkView:

test::test() 
{
}    

void test::Initialize(CoreApplicationView^ applicationView)
{
    applicationView->Activated +=
        ref new TypedEventHandler<CoreApplicationView^, IActivatedEventArgs^>(this, &test::OnActivated);
}

void test::SetWindow(Windows::UI::Core::CoreWindow^ window) {

}    

void test::Load(Platform::String^ entryPoint)
{
}

void test::Run()
{
}

void test::Uninitialize()
{
}

void test::OnActivated(CoreApplicationView^ applicationView, IActivatedEventArgs^ args)
{
    CoreWindow::GetForCurrentThread()->Activate();
}

Попытка создать представление:

auto applicationSource = ref new ApplicationSource();
CoreApplication::CreateNewView(applicationSource);

Иногда приложение работает, иногда оно возврат HR 0x8000000e. Я использую шаблон classi c в Microsoft Visual Studio 2019 "Приложение DirectX11 (UWP - C ++ / CX)

1 Ответ

0 голосов
/ 17 февраля 2020

Вы можете сначала позвонить CoreApplication.CreateNewView, чтобы создать новое окно и поток для просмотра содержимого. Затем отследите идентификатор нового представления. Вы используете это, чтобы показать представление позже. После этого активируйте окно и покажите новый вид. Вы можете попробовать использовать следующий код и, если хотите узнать больше, вы можете обратиться к этому документу , в котором используется c #.

auto newView = CoreApplication::CreateNewView(ref new ApplicationSource());
newView->Dispatcher->RunAsync(CoreDispatcherPriority::Normal, ref new DispatchedHandler([this]()
{
    auto viewId = Windows::UI::ViewManagement::ApplicationView::GetForCurrentView()->Id;
    CoreWindow::GetForCurrentThread()->Activate();
    CoreApplication::MainView->Dispatcher->RunAsync(CoreDispatcherPriority::Normal, ref new DispatchedHandler([viewId]()
    {
        auto asyncAction = Windows::UI::ViewManagement::ApplicationViewSwitcher::SwitchAsync(viewId, Windows::UI::ViewManagement::ApplicationView::GetForCurrentView()->Id);
    }));
}));
...