3

我的应用程序是共享目标应用程序,并且在应用程序运行且用户想要共享内容时遇到问题。我不能使用正在运行的应用程序中的框架,因为那时我得到一个“编组线程”异常。

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

OnStartAsyncApp.xaml.cs中的方法如下所示。

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即应用程序已经运行的情况。我在 Stackoverlow 上发现了一个类似的问题,但它不使用 Template10 库。如何使用 Template10 库处理这种情况。

4

1 回答 1

0

当您在 UWP 上使用共享目标并且您当前的应用程序正在“运行”(实际上已暂停并正在恢复- 首先触发此事件)时,正在创建新的ApplicationView 。这是一件很酷的事情,但必须正确处理——你会得到带有新调度程序的新窗口,如果你尝试从前一个窗口运行某些东西,你会得到“错误线程”异常(特别是要注意INotifyPropertyChanged)。您的应用程序现在至少运行两个线程,您将获得多线程应用程序的所有后果。

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

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

您还可以在变量中记住原始窗口的调度程序,然后在共享后使用它。如果您的代码是async,则在离开共享目标部分之前,您必须注意并确保它完成。

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

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

于 2016-04-12T04:54:06.897 回答