【问题标题】:UWP: Simultaneously control two windows with RadialControllerUWP:使用 RadialController 同时控制两个窗口
【发布时间】:2017-07-10 22:01:37
【问题描述】:

我有一个打开投影窗口的 UWP 应用 (similar to the sample app)。现在,无论哪个窗口处于活动状态,我都想对两个窗口中的 RotationChanged-Event 做出反应。

我可以以某种方式共享RadialController 的实例吗?还是我必须在一个视图中管理它并手动将事件传递给第二个?

更新问题:如何在两个窗口中使用相同的 ViewModel 实例?

P.s:我认为添加 RadialController 和/或 Surface-Dial 作为标签可能有意义。

【问题讨论】:

    标签: c# windows input mvvm uwp


    【解决方案1】:

    使用 UWP,我认为您应该使用 MVVM 模式。

    如果您使用 MVVM 模式,让多个 GUI 元素(包括 Windows)对单个 ViewModel 更改做出反应将是微不足道的。 所以真正的问题是:您使用的是 MVVM 模式、其他模式还是根本不使用模式?

    如果你需要先学习它,我写了一些关于 WPF 的东西(UWP 是 WPF 的后续,加入了与 App 相关的后端内容): https://social.msdn.microsoft.com/Forums/vstudio/en-US/b1a8bf14-4acd-4d77-9df8-bdb95b02dbe2/lets-talk-about-mvvm?forum=wpf

    【讨论】:

    • 我不确定这是否容易。 CoreWindows 在每个专用线程上运行并且是非敏捷类型,您将不得不实现某种编组。除非 C# 语言投影已经实现了这种编组,否则责任就在你身上。不过,我可能是错的。
    • 幸运的是,WPF/UWP 的设计从一开始就考虑到了 Dispatcher 和多线程:stackoverflow.com/questions/32671719/… 您可能必须手动编写 Binding 代码,而不是使用 Binding 类,但这应该是关于它。这是您需要 Viewside 代码的少数情况之一(因为这是 Viewside 问题)。 GUI 元素位于备用线程中有点奇怪(主/原始线程是默认线程),但对于绘制重物来说,它绝对是有意义的。
    • 首先,我使用的是 MVVM。在您的帖子之后,我试图将两个 Windows 绑定到同一个 ViewModel,但最终得到了两个单独的实例:-/ 那么我是否必须使用 Dispatcher 手动将事件发送到第二个窗口?
    【解决方案2】:

    不幸的是,它不像@IInspectable 指出的那样使用相同的 ViewModel 那么简单。这就是为什么我在每个Dial_RotationChanged 上向第二个视图发送一个命令。没有我希望的那么漂亮,但到目前为止效果很好。

    代码看起来有点像这样:

    private async void Dial_RotationChanged(RadialController sender,
                                            RadialControllerRotationChangedEventArgs args)
    {
        await ProjectionViewPageControl.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
        () =>
        {
            var thePage = (DetailPage)((Frame)Window.Current.Content).Content;
            thePage.ProjectionTest(args.RotationDeltaInDegrees);
        });
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多