1

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

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

4

3 回答 3

2

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

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

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

DispatcherQueue dispatcherQueue = DispatcherQueue.GetForCurrentThread();

Task.Run(() => 
{
    ViewModel vm = new ViewModel(dispatcherQueue);
    ...
});
于 2021-11-10T16:06:53.880 回答
1

我可以理解你在使用 WINUI-3 时的痛苦如果你在 threadworkerPool 中并且如果你想回到主线程,那么目前 WINUI-3 将不支持 Dispatcher。而不是那种用途

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

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

于 2021-12-01T04:59:06.797 回答
1

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

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

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

于 2021-11-10T10:02:35.123 回答