如何使用Windows应用程序SDK在WinUI 3 Desktop中获取DispatcherQueue



在WPF中,所有控件都继承DispatcherObject&它很容易到达Dispatcher。

如何使用WinUI 3 Windows应用程序SDK获取DispatcherQueue并在ViewModel中使用它?

编辑

我的实现扩展了mm8最受赞赏的答案。

在我的ViewModel 中创建属性

public Microsoft.UI.Dispatching.DispatcherQueue TheDispatcher { get; set; }

然后在我的MainPage.xaml.cs codeehindMainPage_Loaded事件中获取调度程序

ViewModel.TheDispatcher = this.DispatcherQueue;

现在我在我的虚拟机上有了调度器,所以它很容易从虚拟机使用:

TheDispatcher.TryEnqueue(() =>
{
// some ui thread work
});

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

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

如果您在调度器线程上创建视图模型,您可以在构造函数中调用该方法,也可以直接在初始值设定项中调用,正如我在另一个问题中所演示的那样。

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

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

是的,获取DispatcherQueue与WPF不同,它类似于WinUI3:

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

之后,您可以使用TryEnqueue方法。

我能理解你在使用WINUI-3时的痛苦如果您在threadworkerPool中,并且希望返回到主线程,则WINUI-3目前不支持Dispatcher。而不是使用

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

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

最新更新