Я не уверен, что делаю неправильно, но хотя я определенно нахожусь в потоке пользовательского интерфейса, я постоянно получаю сообщение об ошибке "" Приложение называется интерфейсом, который был назначен для другого потока "."при создании элементов управления 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