我的应用程序是共享的目标应用程序,当应用程序正在运行且用户想要共享内容时遇到问题。我不能使用正在运行的应用程序中的框架,因为那样我会得到一个“编码线程”异常。
应用程序调用了为不同线程编码的接口(interface)。\r\n\r\n无法初始化应用程序的根视觉对象
我在 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 上使用共享目标并且您当前的应用程序正在“运行”时(实际上是暂停并且正在恢复 - 此事件首先被触发),新ApplicationView正在创建。这是一件很酷的事情,但必须正确处理 - 你会得到带有新调度程序的新窗口,如果你尝试运行前一个窗口中的某些东西,你会得到“错误的线程”异常(尤其要注意 INotifyPropertyChanged ).您的应用程序现在至少运行两个线程,您会得到多线程应用程序的所有后果。
最好的一点是您可以在新窗口中放入任何您想要的东西——新页面、框架或其他。一切都取决于您的设计。但是,如果您想运行某些东西/修改您的正在运行 的应用程序,那么您将不得不使用它自己的Dispatcher。例如,您可以通过列出 View 并获取一个 View 来获取它:
await CoreApplication.Views.First().Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { /*do some code*/ });
您还可以在变量中记住原始窗口的调度程序,然后在共享后使用它。如果您的代码是异步,则在离开共享目标部分之前,您必须注意并确保它已完成。
另请注意,您可以使用 ApplicationViewSwitcher显示您的原始窗口(但这不会改变共享代码在不同线程上运行的事实)。
如果您需要有关多 View 编程的更多信息,请查看at MSDN .
关于c# - 在 Windows 10 中共享目标 Universal Apps Template10 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36505979/