如何使用 Windows App SDK 在 WinUI 3 Desktop 中获取 DispatcherQueue
How to get DispatcherQueue in WinUI 3 Desktop using Windows App SDK
在 WPF 中,所有控件都继承 DispatcherObject 并且很容易获得 Dispatcher。
如何使用 WinUI 3 Windows App SDK 获取 DispatcherQueue 并在 ViewModel 中使用它?
编辑
我的实现扩展了 mm8 最受赞赏的答案。
在我的 ViewModel
中创建一个 属性
public Microsoft.UI.Dispatching.DispatcherQueue TheDispatcher { get; set; }
然后在我的 MainPage.xaml.cs 代码隐藏 MainPage_Loaded
事件中获取调度程序
ViewModel.TheDispatcher = this.DispatcherQueue;
现在我的 VM 中有了调度程序,因此可以很容易地从 VM 中使用它:
TheDispatcher.TryEnqueue(() =>
{
// some ui thread work
});
注意:我没有post这是一个答案,这是我的实现,可以帮助任何感兴趣的人。
是的,获取DispatcherQueue与WPF不同,在WinUI3中是这样的:
var dispatcherQueue = Microsoft.UI.Dispatching.DispatcherQueue.GetForCurrentThread();
之后就可以使用TryEnqueue方法了。
在调度程序线程上调用DispatcherQueue.GetForCurrentThread()
API。
如果您在调度程序线程上创建视图模型,您可以在构造函数中或直接在初始化程序中调用该方法,正如我在您的 .
中所演示的那样
如果您在后台线程上创建视图模型,则必须将您之前在实际调度程序线程上创建的 DispatcherQueue
注入它们,例如:
DispatcherQueue dispatcherQueue = DispatcherQueue.GetForCurrentThread();
Task.Run(() =>
{
ViewModel vm = new ViewModel(dispatcherQueue);
...
});
我能理解你使用WINUI-3的痛苦
如果你在 threadworkerPool 中,如果你想回到主线程,WINUI-3 目前将不支持 Dispatcher。
而不是使用
Microsoft.UI.Dispatching.DispatcherQueue.TryEnqueue(() => {
Your code
});
我在这上面浪费了很多时间,最后我得到了这个,希望这对你也有用。
在 WPF 中,所有控件都继承 DispatcherObject 并且很容易获得 Dispatcher。
如何使用 WinUI 3 Windows App SDK 获取 DispatcherQueue 并在 ViewModel 中使用它?
编辑
我的实现扩展了 mm8 最受赞赏的答案。
在我的 ViewModel
中创建一个 属性public Microsoft.UI.Dispatching.DispatcherQueue TheDispatcher { get; set; }
然后在我的 MainPage.xaml.cs 代码隐藏 MainPage_Loaded
事件中获取调度程序
ViewModel.TheDispatcher = this.DispatcherQueue;
现在我的 VM 中有了调度程序,因此可以很容易地从 VM 中使用它:
TheDispatcher.TryEnqueue(() =>
{
// some ui thread work
});
注意:我没有post这是一个答案,这是我的实现,可以帮助任何感兴趣的人。
是的,获取DispatcherQueue与WPF不同,在WinUI3中是这样的:
var dispatcherQueue = Microsoft.UI.Dispatching.DispatcherQueue.GetForCurrentThread();
之后就可以使用TryEnqueue方法了。
在调度程序线程上调用DispatcherQueue.GetForCurrentThread()
API。
如果您在调度程序线程上创建视图模型,您可以在构造函数中或直接在初始化程序中调用该方法,正如我在您的
如果您在后台线程上创建视图模型,则必须将您之前在实际调度程序线程上创建的 DispatcherQueue
注入它们,例如:
DispatcherQueue dispatcherQueue = DispatcherQueue.GetForCurrentThread();
Task.Run(() =>
{
ViewModel vm = new ViewModel(dispatcherQueue);
...
});
我能理解你使用WINUI-3的痛苦 如果你在 threadworkerPool 中,如果你想回到主线程,WINUI-3 目前将不支持 Dispatcher。 而不是使用
Microsoft.UI.Dispatching.DispatcherQueue.TryEnqueue(() => {
Your code
});
我在这上面浪费了很多时间,最后我得到了这个,希望这对你也有用。