如何使用 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 
    });   

我在这上面浪费了很多时间,最后我得到了这个,希望这对你也有用。