У меня есть простое приложение cppWinRT, созданное из шаблона визуальной студии «Пустое приложение». Добавляю 2 кнопки со следующими обработчиками:
Windows::Foundation::IAsyncAction MainPage::ClickHandler(IInspectable const&, RoutedEventArgs const&)
{
OutputDebugStringW((L"\n Entered the function : " + std::to_wstring(GetCurrentThreadId()) + L"\n").c_str());
coreView = winrt::Windows::ApplicationModel::Core::CoreApplication::CreateNewView();
OutputDebugStringW((L"\n Created the view : " + std::to_wstring(GetCurrentThreadId()) + L"\n").c_str());
co_await resume_foreground(coreView.Dispatcher());
auto appView = winrt::Windows::UI::ViewManagement::ApplicationView::GetForCurrentView();
m_window_debug = Windows::UI::Core::CoreWindow::GetForCurrentThread();
OutputDebugStringW((L"\n Switched thread : " + std::to_wstring(GetCurrentThreadId()) + L"\n").c_str());
hstring newTitle = L"my new window";
appView.Title(newTitle);
OutputDebugStringW((L"\n Set new title : " + std::to_wstring(GetCurrentThreadId()) + L"\n").c_str());
m_window_debug.Activated([&, this](auto&& sender, auto&& e) {
OutputDebugStringW((L"\n sender ActivationMode : " + std::to_wstring(static_cast<int>(sender.ActivationMode())) + L"\n").c_str());
OutputDebugStringW((L"\n sender ActivationState : " + std::to_wstring(static_cast<int>(e.WindowActivationState())) + L"\n").c_str());
});
OutputDebugStringW((L"\n Registered the callback : " + std::to_wstring(GetCurrentThreadId()) + L"\n").c_str());
}
Windows::Foundation::IAsyncAction MainPage::ClickHandler2(IInspectable const&, RoutedEventArgs const&)
{
co_await resume_foreground(coreView.Dispatcher());
Windows::UI::Core::CoreWindow::GetForCurrentThread().Activate();
OutputDebugStringW((L"\n After activation : " + std::to_wstring(static_cast<int>(m_window_debug.ActivationMode())) + L"\n").c_str());
}
Я ожидаю, что, когда я нажму кнопку 1 и введу ClickHandler
, новое представление будет создано и готово к активации, так что, когда я нажму кнопку 2 и введу ClickHandler2
, мое вновь созданное представление активируется и, таким образом, станет видимым.
Вместо этого происходит то, что представление не меняется, и я получаю следующий вывод в консоли:
Я нажимаю кнопку 1
Entered the function : 33084
Created the view : 33084
Switched thread : 8928
Set new title : 8928
Registered the callback : 8928
Я нажимаю кнопку 2
After activation : 0
Странно то, что если я помещаю точку останова где-нибудь в ClickHandler
или ClickHandler2
, а затем нажимаю F10 для перехода, а затем F5 для продолжения, это действительно работает, и новое представление становится видимым с новым заголовком. Результат выглядит так:
Я нажимаю кнопку 1
Entered the function : 32432
Window created : 5268
Created the view : 32432
Switched thread : 5268
Set new title : 5268
Registered the callback : 5268
Я нажимаю Button2, разрываю строку в ClickHandler2
, перехожу и продолжаю.
After activation : 0
sender ActivationMode : 3
sender ActivationState : 0
sender ActivationMode : 1
sender ActivationState : 1
На этом этапе виден новый вид, и он работает.
Почему мне нужно взломать код, чтобы мое новое представление стало видимым?