使用C ++ / winrt响应文本框中的事件时,我需要使用ScrollViewer.ChangeView()。麻烦的是,当调用执行时没有任何反应,我希望那是因为那时代码是在错误的线程中;我已经读过这是导致ChangeView()缺乏可见结果的原因。看来正确的做法是使用CoreDispatcher.RunAsync来更新UI线程上的滚动条。这个示例代码仅在C#和托管C ++中提供,然而,弄清楚它在普通C ++中的外观是一件很棘手的事情。无论如何,我没有得到它。有没有人有一个在C ++ / winrt中调用UI线程上的方法的正确方法的例子?感谢。
[更新:]我找到了另一种似乎有用的方法,我将在这里展示,尽管我仍然对以上的答案感兴趣。另一种方法是创建一个归结为此的IAsyncOperation:
IAsyncOperation<bool> ScrollIt(h,v, zoom){
co_await m_scroll_viewer.ChangeView(h,v,zoom);
}
答案 0 :(得分:2)
文档条目Concurrency and asynchronous operations with C++/WinRT: Programming with thread affinity in mind解释了如何控制哪个线程运行某些代码。这在异步函数的上下文中特别有用。
C ++ / WinRT提供助手winrt::resume_background()
和winrt::resume_foreground()
。 co_await
- 任何一个切换到相应的线程(后台线程或与控件的调度程序关联的线程)。
以下代码说明了用法:
IAsyncOperation<bool> ScrollIt(h, v, zoom){
co_await winrt::resume_background();
// Do compute-bound work here.
// Switch to the foreground thread associated with m_scroll_viewer.
co_await winrt::resume_foreground(m_scroll_viewer.Dispatcher());
// Execute GUI-related code
m_scroll_viewer.ChangeView(h, v, zoom);
// Optionally switch back to a background thread.
// Return an appropriate value.
co_return {};
}