Создание элементов управления Xaml в потоке пользовательского интерфейса C ++ / WinRT - PullRequest
0 голосов
/ 28 марта 2019

Я не уверен, что делаю неправильно, но хотя я определенно нахожусь в потоке пользовательского интерфейса, я постоянно получаю сообщение об ошибке "" Приложение называется интерфейсом, который был назначен для другого потока "."при создании элементов управления Xaml в C ++.

См. следующий базовый пример, в котором используется урезанная версия стандартного шаблона CoreApplication C ++ / WinRT:

#include "pch.h"

using namespace winrt;

using namespace Windows;
using namespace Windows::ApplicationModel::Core;
using namespace Windows::Foundation::Numerics;
using namespace Windows::UI;
using namespace Windows::UI::Core;
using namespace Windows::UI::Composition;
using namespace Windows::ApplicationModel::Activation;

struct App : implements<App, IFrameworkViewSource, IFrameworkView> {
  CompositionTarget m_target{nullptr};

  IFrameworkView CreateView() { return *this; }

  void Initialize(CoreApplicationView const &) {}

  void Load(hstring const &) {}

  void Uninitialize() {}

  void Run() {
    CoreWindow window = CoreWindow::GetForCurrentThread();
    winrt::Windows::UI::Xaml::Controls::TextBox textbox; // Crashes here

    CoreDispatcher dispatcher = window.Dispatcher();
    dispatcher.ProcessEvents(CoreProcessEventsOption::ProcessUntilQuit);
  }

  void SetWindow(CoreWindow const &) {
    Compositor compositor;
    ContainerVisual root = compositor.CreateContainerVisual();
    m_target = compositor.CreateTargetForCurrentView();
    m_target.Root(root);
  }
};

int __stdcall wWinMain(HINSTANCE, HINSTANCE, PWSTR, int) { CoreApplication::Run(make<App>()); }

Я пытался использовать window.Dispatcher().HasThreadAccess(), чтобы убедиться, что я нахожусь в правильном потоке для выполнения вызовов пользовательского интерфейса, и он всегда возвращает true.

Я также пытался вызвать RunAsync() из окна Dispatcher и создатьОбъект Xaml в лямбде передается этому методу, и он все еще имеет точно такой же результат.HasThreadAccess возвращает true и здесь.

Может кто-нибудь объяснить мне, где я здесь не так?Создание объектов Xaml не поддерживается в C ++?

[править]

Вот пример проекта, который воспроизводит проблему, опять же на основе шаблона CoreWindow C ++ / WinRT по умолчанию:

https://github.com/lyptt/CoreApp1

1 Ответ

0 голосов
/ 29 марта 2019

Оказывается, что шаблон на основе CoreApplication не поддерживает ничего из пространства имен Xaml, так как он больше предназначен для предоставления тонкого слоя UWP для игр и т. Д.

Чтобы получить поддержку Xaml, вам необходимо использовать полнуювместо шаблона, тогда все волшебным образом начинает работать.

...