【问题标题】:How to get DispatcherQueue in WinUI 3 Desktop using Windows App SDK如何使用 Windows App SDK 在 WinUI 3 桌面中获取 DispatcherQueue
【发布时间】:2021-11-08 14:42:49
【问题描述】:

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

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

【问题讨论】:

    标签: c# .net dispatcher winui-3 windows-app-sdk


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      之后就可以使用TryEnqueue方法了。

      【讨论】:

        【解决方案3】:

        我能理解你在使用 WINUI-3 时的痛苦 如果你在 threadworkerPool 中并且你想回到主线程 Dispatcher 将不被 WINUI-3 支持。 而不是那个用途

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

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

        【讨论】:

          猜你喜欢
          • 2022-08-24
          • 2022-10-14
          • 2021-05-13
          • 2021-09-28
          • 2021-12-27
          • 2021-10-23
          • 1970-01-01
          • 2022-12-16
          • 2021-12-19
          相关资源
          最近更新 更多