如何使用 Windows App SDK 在 WinUI 3 桌面中获取 DispatcherQueue

Tin*_*ren 12 .net c# dispatcher winui-3 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 代码隐藏中获取调度程序Constructor

ViewModel.TheDispatcher = Microsoft.UI.Dispatching.DispatcherQueue.GetForCurrentThread();

现在我的虚拟机中有调度程序,因此可以轻松地从虚拟机使用它:

TheDispatcher.TryEnqueue(() =>
{
     // some ui thread work
});
Run Code Online (Sandbox Code Playgroud)

注意:我没有将此作为答案发布,因为有一个答案,这是我的实现,旨在帮助任何感兴趣的人。

mm8*_*mm8 25

在调度程序线程上调用DispatcherQueue.GetForCurrentThread()API 。

如果您在调度程序线程上创建视图模型,则可以在构造函数中调用该方法,或者直接在初始化程序中调用该方法,正如我在其他问题中演示的那样。

如果您在后台线程上创建视图模型,则必须将DispatcherQueue之前在实际调度程序线程上创建的视图模型注入它们,例如:

DispatcherQueue dispatcherQueue = DispatcherQueue.GetForCurrentThread();

Task.Run(() => 
{
    ViewModel vm = new ViewModel(dispatcherQueue);
    ...
});
Run Code Online (Sandbox Code Playgroud)

  • 我对这个答案赞不绝口。我感到震惊的是,在其他地方(例如,在 MS 文档中)找到此指南是多么困难,这些文档甚至没有正确更新命名空间。谢谢。其他来到这里的人请仔细阅读此答案。您必须在 UI 线程上调用 GetForCurrentThread(),然后引用它以供其他线程稍后使用! (5认同)