在 Windows 10 中共享目标 Universal Apps Template10 方法

Sharing target Universal Apps Template10 approach in Windows 10

我的应用程序是共享的目标应用程序,当应用程序 运行 并且用户想要共享内容时遇到问题。我无法使用来自 运行 应用程序的框架,因为那时我得到了 "marshalling thread" 异常。

应用程序调用了为不同线程编组的接口。\r\n\r\nFailed初始化应用程序的根视觉对象

我在 App.xaml.cs 中的 OnStartAsync 方法如下所示。

public override async Task OnStartAsync(StartKind startKind, IActivatedEventArgs args)
{
    switch (DetermineStartCause(args))
    {
        // other cases
        case AdditionalKinds.Other:
            if (args is ShareTargetActivatedEventArgs)
            {
                var shareArgs = args as ShareTargetActivatedEventArgs;

                if (shareArgs.PreviousExecutionState != ApplicationExecutionState.Running)
                {
                    Uri webUrl = await shareArgs.ShareOperation.Data.GetWebLinkAsync();
                    Debug.WriteLine(webUrl.AbsoluteUri);

                    //shareArgs.ShareOperation.ReportStarted();
                    NavigationService.Navigate(typeof(Views.MainPage), webUrl.AbsoluteUri);
                }
                else
                {
                        await CoreApplication.Views.First().Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
                        {
                            Uri webUrl = await shareArgs.ShareOperation.Data.GetWebLinkAsync();
                            var nav = NavigationServiceFactory(BackButton.Attach, ExistingContent.Exclude);
                            Window.Current.Content = new Views.ShareLaunch();
                            Window.Current.Activate();
                        });
                }
            }
            break;
    }
}

我不确定如何处理 ShareTargetActivatedEventArgs 的 else 条件,即应用程序已经 运行 的情况。我找到了一个 similar question on Stackoverlow 但它没有使用 Template10 库。如何使用 Template10 库处理这种情况。

当您在 UWP 上使用共享目标时,您当前的应用程序是 'running'(实际上是 suspended 并且正在 resumed - 此事件首先触发),正在创建新的 ApplicationView。这是一件很酷的事情,但必须正确处理 - 你会得到新的 window 和新的调度程序,如果你尝试 运行 以前的东西你会得到 'wrong thread' 异常(特别要注意对于 INotifyPropertyChanged)。您的应用程序现在 运行ning 至少有两个线程,您会得到 多线程 应用程序的所有后果。

最好的是,您可以放入新的 window 任何您想要的东西 - 新页面、框架或其他。一切都取决于您的设计。但是如果你想 运行 something/modify 你的 运行ning 应用程序,那么你将不得不使用它自己的 Dispatcher。例如,您可以通过列出视图并获取一个来获取它:

await CoreApplication.Views.First().Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { /*do some code*/ });

你也可以在变量中记住你原来的window的调度器,然后共享后使用它。如果您的代码是 async,您必须在离开共享目标部分之前注意并确保它完成。

另请注意,您可以使用 ApplicationViewSwitcher 显示原始 window(但这不会改变共享代码在不同线程上 运行 的事实) .

如果您需要有关多视图编程的更多信息,请查看at MSDN