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

问题描述 投票:0回答:3

在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
});

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

c# .net dispatcher winui-3 windows-app-sdk
3个回答
25
投票

在调度程序线程

上调用 
DispatcherQueue.GetForCurrentThread() API

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

如果您在后台线程上创建视图模型,则必须使用您之前在实际调度程序线程上创建的

DispatcherQueue
注入它们,例如:

DispatcherQueue dispatcherQueue = DispatcherQueue.GetForCurrentThread();

Task.Run(() => 
{
    ViewModel vm = new ViewModel(dispatcherQueue);
    ...
});

4
投票

是的,获取DispatcherQueue与WPF不同,在WinUI3中是这样的:

var dispatcherQueue = Microsoft.UI.Dispatching.DispatcherQueue.GetForCurrentThread();

之后你可以使用 TryEnqueue 方法。


4
投票

我能理解您在使用WINUI-3时的痛苦 如果您在 threadworkerPool 中并且想要返回主线程,那么 WINUI-3 目前将不支持 Dispatcher。 而不是那个用途

Microsoft.UI.Dispatching.DispatcherQueue.TryEnqueue(() => {
         Your code 
    });   

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

© www.soinside.com 2019 - 2024. All rights reserved.